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