Class: GrubY::Dispatcher

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

Instance Method Summary collapse

Constructor Details

#initializeDispatcher

Returns a new instance of Dispatcher.



3
4
5
6
# File 'lib/gruubY/dispatcher.rb', line 3

def initialize
  @handlers = {}
  @next_handler_id = 1
end

Instance Method Details

#off(event, handler_id = nil, &block) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/gruubY/dispatcher.rb', line 16

def off(event, handler_id = nil, &block)
  return false unless @handlers[event]

  before = @handlers[event].length
  @handlers[event].reject! do |entry|
    if handler_id
      entry[:id] == handler_id
    elsif block
      entry[:block] == block
    else
      false
    end
  end
  before != @handlers[event].length
end

#on(event, filter = nil, group: 0, &block) ⇒ Object



8
9
10
11
12
13
14
# File 'lib/gruubY/dispatcher.rb', line 8

def on(event, filter = nil, group: 0, &block)
  id = @next_handler_id
  @next_handler_id += 1
  (@handlers[event] ||= []) << { id: id, filter: filter, block: block, group: group.to_i }
  @handlers[event].sort_by! { |h| h[:group] }
  id
end

#trigger(event, ctx) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/gruubY/dispatcher.rb', line 32

def trigger(event, ctx)
  return unless @handlers[event]

  @handlers[event].each do |entry|
    filter = entry[:filter]
    handler = entry[:block]
    if filter
      pass = begin
        if defined?(GrubY::Filters::Filter) && filter.is_a?(GrubY::Filters::Filter)
          filter.call(nil, nil, ctx)
        elsif filter.respond_to?(:call)
          filter.call(ctx)
        else
          true
        end
      rescue ArgumentError
        filter.call(nil, nil, ctx)
      end
      next unless pass
    end
    begin
      handler.call(ctx)
    rescue => e
      warn "[DISPATCHER] #{event} handler failed: #{e.class}: #{e.message}"
    end
  end
end