// has equals semantics so passing it to onChange() etc is idempotent srecord ChangeTrigger(ChangeTriggerable target) is Runnable { run { target?.change(); } }