sclass VMBusListenerWithLivelinessCheck implements IF2 { Set listeners; // where we were added IF0 livelinessCheck; O listener; bool verbose; *(Set *listeners, IF0 *livelinessCheck, O *listener) {} *(Set *listeners, IF0 *livelinessCheck, IVF2 *listener) {} public O get(S msg, O arg) { bool live = false; pcall { live = livelinessCheck == null || livelinessCheck.get(); } if (!live) { if (verbose) print VMBusListenerWithLivelinessCheck("Removing VM bus listener"); remove(listeners, this); null; } ret callF(listener, msg, arg); } }