class ASTNode class Wrap(val message: String) typealias WrappingStrategy = (childElement: ASTNode) -> Wrap? fun getWrappingStrategy(): WrappingStrategy { return wrap@{ childElement -> Wrap("OK").let { return@wrap it } } } fun getWrapAfterAnnotation(childElement: ASTNode): Wrap? { return Wrap("OK") } fun box(): String { return getWrappingStrategy().invoke(ASTNode())?.message ?: "fail" }