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