These are two independent ideas, without any intersections:
as tapereader { def read() { ... } } as diskreader { def read() { ... } }
And this is how we extend them together:
as buffered { as tapereader, diskreader { def read() { ... super.read() ... } } } class BufferedTapereader = buffered tapereader. class BufferedDiskreader = buffered diskreader.
Which is short for:
as buffered { as tapereader { def read() { ... super.read() ... } } as diskreader { def read() { ... super.read() ... } } }
Syntax as used in the examples until here does however not allow to express the following as a template:
as buffered { as diskreader { as floppy { def read() { ... super.read() ... } } } as tapereader { def read() { ... super.read() ... } } }
So we add an alternative syntax for nestings that only consist of an intersection:
as buffered { as diskreader->floppy { def read() { ... super.read() ... } } as tapereader { def read() { ... super.read() ... } } }
And then we can write the template:
as buffered { as tapereader, diskreader->floppy { def read() { ... super.read() ... } } }
Note how the arrow syntax is also suitable for expressing traditional subclassing concisely:
class car->taxi { ... } class Taxi = taxi car.