Class: Eventception::Dispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/eventception/dispatcher.rb

Instance Method Summary collapse

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

#listenersObject

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

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

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