Class: Eventception::Dispatcher
- Inherits:
-
Object
- Object
- Eventception::Dispatcher
- Defined in:
- lib/eventception/dispatcher.rb
Instance Method Summary collapse
-
#add_listener(event_name:, listener:, listener_method:, priority: 0) ⇒ Object
Add an event listener that listens to the specified event.
-
#add_subscriber(subscriber:) ⇒ Object
Add an event subscriber.
-
#dispatch(event_name:, event: Eventception::Event.new) ⇒ Object
Dispatches an event to all registered listeners.
-
#listeners ⇒ Object
Gets all listeners sorted by descending priority.
-
#listeners? ⇒ Boolean
Checks whether are any registered listeners.
-
#listeners_for(event_name:) ⇒ Object
Gets all listeners for the specific event sorted by descending priority.
-
#listeners_for?(event_name:) ⇒ Boolean
Checks whether are any registered listeners for the specific event.
- #remove_listener(event_name:, listener:, listener_method:) ⇒ Object
- #remove_subscriber(subscriber:) ⇒ Object
Instance Method Details
#add_listener(event_name:, listener:, listener_method:, priority: 0) ⇒ Object
Add an event listener that listens to the specified event.
Parameters:
- event_name
-
The event to listen on
- listener
-
The listener
- priority
-
The higher this value, the earlier an event listener will be triggered in the chain (defaults to 0)
102 103 104 105 106 107 |
# File 'lib/eventception/dispatcher.rb', line 102 def add_listener(event_name:, listener:, listener_method:, priority: 0) event_listeners[event_name][priority] << ListenerHandler.new(listener, listener_method) sorted.delete(event_name) nil end |
#add_subscriber(subscriber:) ⇒ Object
Add an event subscriber.
The subscriber is asked for all the events he is interested in and added as a listener for these events.
Parameters:
- subscriber
-
The subscriber
131 132 133 134 135 136 137 138 139 140 |
# File 'lib/eventception/dispatcher.rb', line 131 def add_subscriber(subscriber:) subscriber.subscribed_events.each do |event_subscribed| add_listener( event_name: event_subscribed.fetch(:event_name), listener: subscriber, listener_method: event_subscribed.fetch(:listener_method), priority: event_subscribed[:priority] || 0, ) end end |
#dispatch(event_name:, event: Eventception::Event.new) ⇒ Object
Dispatches an event to all registered listeners.
Parameters:
- event_name
-
The name of the event to dispatch. The name of the event is the name of the method that is invoked on listeners.
- event
-
The event to pass to the event handlers/listeners If not supplied, an empty Event instance is created.
Returns:
The Event.
38 39 40 41 42 43 44 |
# File 'lib/eventception/dispatcher.rb', line 38 def dispatch(event_name:, event: Eventception::Event.new) if listeners_for?(event_name: event_name) do_dispatch(listeners: listeners_for(event_name: event_name), event: event) end event end |
#listeners ⇒ Object
Gets all listeners sorted by descending priority.
Returns:
All event listeners sorted by event_name and descending priority.
51 52 53 54 55 56 57 58 59 |
# File 'lib/eventception/dispatcher.rb', line 51 def listeners return [] if event_listeners.empty? event_listeners.each_key do |event_name| sort_listeners(event_name) if sorted[event_name].empty? end sorted end |
#listeners? ⇒ Boolean
Checks whether are any registered listeners.
Returns:
Boolean
66 67 68 |
# File 'lib/eventception/dispatcher.rb', line 66 def listeners? listeners.any? end |
#listeners_for(event_name:) ⇒ Object
Gets all listeners for the specific event sorted by descending priority.
Returns:
The event listeners for the specific event sorted by descending priority.
75 76 77 78 79 80 81 |
# File 'lib/eventception/dispatcher.rb', line 75 def listeners_for(event_name:) return [] if event_listeners[event_name].empty? sort_listeners(event_name) if sorted[event_name].empty? sorted[event_name] end |
#listeners_for?(event_name:) ⇒ Boolean
Checks whether are any registered listeners for the specific event.
Returns:
Boolean
88 89 90 |
# File 'lib/eventception/dispatcher.rb', line 88 def listeners_for?(event_name:) event_listeners[event_name].any? end |
#remove_listener(event_name:, listener:, listener_method:) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/eventception/dispatcher.rb', line 109 def remove_listener(event_name:, listener:, listener_method:) return unless listeners_for?(event_name: event_name) listener_for_event = event_listeners.fetch(event_name) listener_for_event.each do |priority, priority_listeners| sorted.delete(event_name) if priority_listeners.delete(ListenerHandler.new(listener, listener_method)) listener_for_event.delete(priority) if priority_listeners.empty? end event_listeners.delete(event_name) if listener_for_event.empty? end |
#remove_subscriber(subscriber:) ⇒ Object
142 143 144 145 146 147 148 149 150 |
# File 'lib/eventception/dispatcher.rb', line 142 def remove_subscriber(subscriber:) subscriber.subscribed_events.each do |event_subscribed| remove_listener( event_name: event_subscribed.fetch(:event_name), listener: subscriber, listener_method: event_subscribed.fetch(:listener_method), ) end end |