Class: EventChain

Inherits:
Object show all
Defined in:
lib/volt/reactive/event_chain.rb

Instance Method Summary collapse

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



96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/volt/reactive/event_chain.rb', line 96

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



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/volt/reactive/event_chain.rb', line 69

def add_object(object, &block) 
  # puts "ADD OBJECT: #{object.inspect} to #{self.inspect}" 
    
  chain_listener = ChainListener.new(self, object, block)

  listeners = {}
  
  all_listening_events.uniq.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

#all_listening_eventsObject



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/volt/reactive/event_chain.rb', line 53

def all_listening_events
  all_listeners = []
  all_listeners += @main_object.listeners.keys
  
  if @main_object
    @main_object.event_followers.each do |event_follower|
      all_listeners += event_follower.listeners.keys
    end
  end
  
  return all_listeners.uniq
end

#remove_event(event) ⇒ Object

Removes the event from all events in all objects



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/volt/reactive/event_chain.rb', line 111

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



87
88
89
90
91
92
93
94
# File 'lib/volt/reactive/event_chain.rb', line 87

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
# File 'lib/volt/reactive/event_chain.rb', line 42

def setup_listener(event, chain_listener)
  return chain_listener.object.on(event, @main_object) do |*args|
    if callback = chain_listener.callback
      callback.call(event, *args)
    else
      # Trigger on this value, when it happens on the parent
      @main_object.trigger!(event, *args)
    end
  end
end