Class: GrubY::Dispatcher
- Inherits:
-
Object
- Object
- GrubY::Dispatcher
- Defined in:
- lib/gruubY/dispatcher.rb
Instance Method Summary collapse
-
#initialize ⇒ Dispatcher
constructor
A new instance of Dispatcher.
- #off(event, handler_id = nil, &block) ⇒ Object
- #on(event, filter = nil, group: 0, &block) ⇒ Object
- #trigger(event, ctx) ⇒ Object
Constructor Details
#initialize ⇒ Dispatcher
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.}" end end end |