import kotlin.reflect.KClass // TODO: make the default type of U to Any, // and the default prepare to {} (lambda returning unit) // I should be able to remove the prepare arg in main class Rule( val clazz: KClass, val name: String, private val prepare: T.() -> U = { Unit as U}, private val whenTrue: T.(U) -> Boolean = { true }, private val thenDo: T.(U) -> Unit = {}, ) { fun fire(arg: T): Boolean { if (!clazz.isInstance(arg)) return false val prepareResult = arg.prepare() if (arg.whenTrue(prepareResult)) { arg.thenDo(prepareResult) return true } return false } } fun main() { val rule=Rule(String::class, "accepts all string", prepare={}) }