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|