Class: EventChain
Instance Method Summary collapse
- #add_event(event) ⇒ Object
-
#add_object(object, &block) ⇒ Object
We can chain our events to any other object that includes Events.
-
#initialize(main_object) ⇒ EventChain
constructor
A new instance of EventChain.
-
#remove_event(event) ⇒ Object
Removes the event from all events in all objects.
- #remove_object(chain_listener) ⇒ Object
-
#setup_listener(event, chain_listener) ⇒ Object
Register an event listener that chains from object to self.
Constructor Details
#initialize(main_object) ⇒ EventChain
Returns a new instance of EventChain.
35 36 37 38 39 |
# File 'lib/volt/reactive/event_chain.rb', line 35 def initialize(main_object) @event_chain = {} @main_object = main_object @event_counts = {} end |
Instance Method Details
#add_event(event) ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/volt/reactive/event_chain.rb', line 90 def add_event(event) unless @event_counts[event] @event_chain.each_pair do |chain_listener,listeners| # Only add if we haven't already chained this event unless listeners[event] listeners[event] = setup_listener(event, chain_listener) end end end @event_counts[event] ||= 0 @event_counts[event] += 1 end |
#add_object(object, &block) ⇒ Object
We can chain our events to any other object that includes Events
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/volt/reactive/event_chain.rb', line 63 def add_object(object, &block) # puts "ADD OBJECT: #{object.inspect} to #{self.inspect}" chain_listener = ChainListener.new(self, object, block) listeners = {} @main_object.listeners.keys.each do |event| # Create a listener for each event listeners[event] = setup_listener(event, chain_listener) end @event_chain[chain_listener] = listeners return chain_listener end |
#remove_event(event) ⇒ Object
Removes the event from all events in all objects
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/volt/reactive/event_chain.rb', line 105 def remove_event(event) if @event_counts[event] count = @event_counts[event] -= 1 if count == 0 @event_chain.each_pair do |chain_listener,listeners| listeners[event].remove# if listeners[event] listeners.delete(event) end # Also remove the event count @event_counts.delete(event) end end end |
#remove_object(chain_listener) ⇒ Object
81 82 83 84 85 86 87 88 |
# File 'lib/volt/reactive/event_chain.rb', line 81 def remove_object(chain_listener) @event_chain[chain_listener].each_pair do |event,listener| # Unbind each listener listener.remove end @event_chain.delete(chain_listener) end |
#setup_listener(event, chain_listener) ⇒ Object
Register an event listener that chains from object to self
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/volt/reactive/event_chain.rb', line 42 def setup_listener(event, chain_listener) return chain_listener.object.on(event, @main_object) do |filter, *args| if callback = chain_listener.callback callback.call(event, filter, *args) else # Trigger on this value, when it happens on the parent # Only pass the filter from non-reactive to reactive? This # lets us scope the calls on a proxied object. # Filters limit which listeners are triggered, passing them to # the ReactiveValue's from non-reactive lets us filter at the # reactive level as well. filter = nil unless !chain_listener.object.reactive? && @main_object.reactive? @main_object.trigger!(event, filter, *args) end end end |