lib/finite_machine/observer.rb in finite_machine-0.3.0 vs lib/finite_machine/observer.rb in finite_machine-0.4.0

- old
+ new

@@ -1,7 +1,9 @@ # encoding: utf-8 +require 'set' + module FiniteMachine # A class responsible for observing state changes class Observer include Threadable @@ -96,17 +98,23 @@ self.to = _transition.to self.name = _transition.name end end + # Run callback + # + # @api private def run_callback(hook, event) trans_event = TransitionEvent.new trans_event.build(event.transition) data = event.data - deferred_hook = proc { |_trans_event, *_data| + transition = event.transition + deferred_hook = proc do |_trans_event, *_data| machine.instance_exec(_trans_event, *_data, &hook) - } - deferred_hook.call(trans_event, *data) + end + callable = Callable.new(deferred_hook) + result = callable.call(trans_event, *data) + transition.cancelled = (result == CANCELLED) end def trigger(event, *args, &block) sync_exclusive do [event.type, ANY_EVENT].each do |event_type|