Method: Netfira::WebConnect.dispatch_event

Defined in:
lib/netfira/web_connect/events.rb

.dispatch_event(timing, event, *args) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/netfira/web_connect/events.rb', line 7

def self.dispatch_event(timing, event, *args)

  # Allow multiple timings to be dispatched simultaneously, e.g. [:on, :after]
  return timing.each{ |t| dispatch_event(t, event, *args) { yield } } if timing.respond_to? :each

  # The method to invoke, e.g. :on_update_product
  target = :"#{timing}_#{event}"

  # Delegates that respond to this method
  delegates = event_delegates.select { |d| d.respond_to? target }

  # 'Around' events get special treatment
  if timing == :around
    chain_runner = -> do
      delegate = delegates.shift
      if delegate
        delegate.__send__ target, *args, &chain_runner
      else
        yield
      end
    end
    chain_runner.call
  else
    delegates.map { |d| d.__send__ target, *args }
  end
end