class AsyncListener include Celluloid if defined?(Celluloid) attr_reader :listener, :event_method def initialize(listener, event_method) @listener = listener @event_method = event_method.to_sym end def method_missing(method, *args, &block) if listener.respond_to?(method) if method == event_method listener.public_send(method, *args, &block) terminate else listener.public_send(method, *args, &block) end else super(method, *args, &block) end end end