class Rule( val clazz: KClass, val name: String, private val whenTrue: T.() -> Boolean, private val thenDo: Rule.(T) -> Unit ) { fun fire(arg: T): Boolean { if (this.whenTrue(arg)) { thenDo(arg) return true } return false } } class RuleSet(private val rules: MutableList>) { fun fire(arg: Any): Set> = rules.filter { r -> (r as Rule).fire(arg) }.toSet() }