A function that receives its arguments from DI object graph, including named instances via izumi.distage.model.definition.Id annotation.
The following syntaxes are supported by extractor macro:
Inline lambda:
make[Unit].from {
i: Int @Id("special") => ()
}
Method reference:
def constructor(@Id("special") i: Int): Unit = ()
make[Unit].from(constructor _)
make[Unit].from(constructor(_))
Function value with an annotated signature:
val constructor: (Int @Id("special"), String @Id("special")) => Unit = (_, _) => ()
make[Unit].from(constructor)
Using intermediate vals will lose annotations when converting a method into a function value, Prefer passing inline lambdas such as { x => y } or method references such as (method _) or (method(_)).:
def constructorMethod(@Id("special") i: Int): Unit = ()
val constructor = constructorMethod _
make[Unit].from(constructor) // SURPRISE: Will summon regular Int, not a "special" Int from DI object graph
make[Unit].from(constructorMethod _) // Will work correctly: summon "special" Int
Prefer annotating parameter types, not parameters: class X(i: Int @Id("special")) { ... }
final case class X(i: Int @Id("special"))
make[X].from(X.apply _) // summons special Int