…from theBLACK LAGOON
traitUserModule{
defloadUser(id:Long): User}traitTweetModule{
defpost(userId:Long, body: String)
classFoo(x:Int) {
defadd(y:Int
traitExists{
typeA
traitExists{
typeA
deffoo(a: A): Option[A]}
Q: What is the essence of modularity?
A: Informationhiding!
traitThing[-A, +B]{
typeX
defsource(a: A): X
defbippy(t: Thing[Int, String]) = {
valstate: t.X
It’s a module, Jim, but not as weknow it…
traitUserModule{
deflogin(name: String, pass: String) = {
// do stuff}
defsave(user: User) {
traitMessageModule
extendsUserModule{
defrender(msg: Message): Group[Node]= {
// yay, anti-xml user!}
uh oh…
traitMessageModule
extendsUserModule{
objectmessage{
defrender(msg: Message): Group[Node]= {
// yay, anti-xml user!
traitUserModule{
deflogin(name: String,pass: String): Option[User]
defsave(user: User):Unit
traitMongoUserModule
extendsUserModule{
deflogin(user: String, pass: String) = {
…}
…}
traitUserModule{
…
case classUser(…) {
def
traitUserModule{
…
typeUser <: UserLike
traitUserLike{this: User=>
traitMongoUserModule
extendsUserModule{
…
classUser(…)extendsUserLike
traitLifecycle{
defstartup():Unit
defshutdown():Unit
traitMongoUserModule
extendsUserModule
withLifecycle{
abstract
override
defstartup() {
traitSystemModule{
valuserModule:UserModule
defdoStuff() = {userModule.makeUsers()userModule.encourageMemes()
// ???
traitSystemModule{
defdoStuff(userModule: UserModule) = {userModule.makeUsers()userModule.encourageMemes()
// ???userModule.profit()}}
traitStorageModule{
defstore(id:Long, data: ByteBuffer)
defretrieve(id:Long): ByteBuffer}
// curse you, naming conventions!traitUserModuleModule
extendsStorageModule{
traitUserModule{
typeUser <: UserLike
…}}trait
traitA{
valfoo:String}traitB
extendsA{
traitA{
deffoo:String}traitB
extendsA{
traitA{
objectstuff{
objectFoo
objectBar
objectBaz
traitA{
objectstuff{
valFoo
valBar
valBaz