Module: Eventable

Included in:
Channel, ChannelStub, ComponentNode, ReactiveArray
Defined in:
lib/volt/reactive/eventable.rb

Instance Method Summary collapse

Instance Method Details

#on(event, &callback) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/volt/reactive/eventable.rb', line 28

def on(event, &callback)
  event = event.to_sym
  listener = Listener.new(self, event, callback)
  @listeners ||= {}
  @listeners[event] ||= []
  @listeners[event] << listener

  first_for_event = @listeners[event].size == 1
  first = first_for_event && @listeners.size == 1

  # Let the included class know that an event was registered. (if it cares)
  if self.respond_to?(:event_added)
    # call event added passing the event, the scope, and a boolean if it
    # is the first time this event has been added.
    self.event_added(event, first, first_for_event)
  end

  return listener
end

#remove_listener(event, listener) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/volt/reactive/eventable.rb', line 60

def remove_listener(event, listener)
  event = event.to_sym

  raise "Unable to delete #{event} from #{self.inspect}" unless @listeners && @listeners[event]

  @listeners[event].delete(listener)

  last_for_event = @listeners[event].size == 0

  if last_for_event
    # No registered listeners now on this event
    @listeners.delete(event)
  end

  last = last_for_event && @listeners.size == 0

  # Let the class we're included on know that we removed a listener (if it cares)
  if self.respond_to?(:event_removed)
    # Pass in the event and a boolean indicating if it is the last event
    self.event_removed(event, last, last_for_event)
  end
end

#trigger!(event, *args) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/volt/reactive/eventable.rb', line 48

def trigger!(event, *args)
  event = event.to_sym

  return unless @listeners && @listeners[event]

  # TODO: We have to dup here because one trigger might remove another
  @listeners[event].dup.each do |listener|
    # Call the event on each listener
    listener.call(*args)
  end
end