lib/finite_machine/observer.rb in finite_machine-0.10.2 vs lib/finite_machine/observer.rb in finite_machine-0.11.0
- old
+ new
@@ -1,8 +1,8 @@
# encoding: utf-8
-require 'set'
+require 'finite_machine/hooks'
module FiniteMachine
# A class responsible for observing state changes
class Observer
include Threadable
@@ -102,19 +102,26 @@
def once_on_after(*args, &callback)
on HookEvent::After, *args, &callback.extend(Once)
end
- # Trigger all listeners
+ # Execute each of the hooks in order with supplied data
#
+ # @param [HookEvent] event
+ # the hook event
+ #
+ # @param [Array[Object]] data
+ #
+ # @return [nil]
+ #
# @api public
- def trigger(event, *args, &block)
+ def emit(event, *data)
sync_exclusive do
[event.type].each do |event_type|
[event.name, ANY_STATE, ANY_EVENT].each do |event_name|
hooks.call(event_type, event_name) do |hook|
- handle_callback(hook, event)
+ handle_callback(hook, event, *data)
off(event_type, event_name, &hook) if hook.is_a?(Once)
end
end
end
end
@@ -132,31 +139,40 @@
# Create callable instance
#
# @api private
def create_callable(hook)
- deferred_hook = proc do |_trans_event, *_data|
- machine.instance_exec(_trans_event, *_data, &hook)
+ callback = proc do |trans_event, *data|
+ machine.instance_exec(trans_event, *data, &hook)
end
- Callable.new(deferred_hook)
+ Callable.new(callback)
end
# Handle callback and decide if run synchronously or asynchronously
#
+ # @param [Proc] :hook
+ # The hook to evaluate
+ #
+ # @param [HookEvent] :event
+ # The event for which the hook is called
+ #
+ # @param [Array[Object]] :data
+ #
# @api private
- def handle_callback(hook, event)
- data = event.data
- trans_event = TransitionEvent.new(event.transition, *data)
+ def handle_callback(hook, event, *data)
+ to = machine.events_chain.move_to(event.event_name, event.from, *data)
+ trans_event = TransitionEvent.new(event, to)
callable = create_callable(hook)
if hook.is_a?(Async)
defer(callable, trans_event, *data)
result = nil
else
result = callable.call(trans_event, *data)
end
- event.transition.cancelled = (result == CANCELLED)
+ machine.events_chain.cancel_transitions(event.event_name,
+ (result == CANCELLED))
end
# Callback names including all states and events
#
# @return [Array[Symbol]]