var sayResult = "" class NoiseMaker { fun say(str: String) { sayResult += str } } fun noiseMaker(f: NoiseMaker.() -> Unit) { val noiseMaker = NoiseMaker() noiseMaker.f() } abstract class Pet { fun NoiseMaker.playWith(friend: T) { say("Playing with " + friend) } abstract fun play(): Unit } class Doggy(): Pet() { override fun play() = noiseMaker { say("Time to play! ") playWith("my owner!") } } fun box(): String { Doggy().play() if (sayResult != "Time to play! Playing with my owner!") return "fail: $sayResult" return "OK" }