scala-macro-aop
scala-macro-aop copied to clipboard
scala-macro-aop
delegate / proxy / decorator
The @delegate macro annotation can be applied to class parameters. The macro will generate missing methods which
delegate calls to the annotated value.
Currently the implementation is at a POC stage, doesn't support overloading, method type parameters or multiple parameter lists.
For example:
trait Foo {
def method1(): String
def method2(p1: String): Long
def method3(p1: String): Int
def method4(p1: String, p2: Long): String
}
class FooImpl extends Foo {
def method1() = "m1"
def method2(p1: String) = 42L
def method3(p1: String) = p1.length()
def method4(p1: String, p2: Long) = s"ok $p1 $p2"
}
class FooWrapper(@delegate wrapped: Foo) extends Foo {
def method2(p1: String) = 41L
}
This will compile, even though there's no direct definition of method1, method3 or method4 in FooWrapper.
That's because of the @delegate macro annotation, which will generate the missing methods (method2 is already
defined). The generated code will be, for example:
def method4(p1: String, p2: Long) = wrapped.method4(p2, p3)
To see the macro in action, execute sbt run.
See also the blog: Automatic generation of delegate methods with Macro Annotations