Class: Invoker::Event::Manager

Inherits:
Object
  • Object
show all
Defined in:
lib/invoker/event/manager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeManager

Returns a new instance of Manager.



6
7
8
9
10
# File 'lib/invoker/event/manager.rb', line 6

def initialize
  @scheduled_events = Hash.new {|h,k| h[k] = [] }
  @triggered_events = []
  @trigger_mutex = Mutex.new()
end

Instance Attribute Details

#scheduled_eventsObject

Returns the value of attribute scheduled_events.



4
5
6
# File 'lib/invoker/event/manager.rb', line 4

def scheduled_events
  @scheduled_events
end

#triggered_eventsObject

Returns the value of attribute triggered_events.



4
5
6
# File 'lib/invoker/event/manager.rb', line 4

def triggered_events
  @triggered_events
end

Instance Method Details

#run_scheduled_eventsObject

On next iteration of event loop, this method is called and we try to match scheduled events with events that were triggered.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/invoker/event/manager.rb', line 39

def run_scheduled_events
  filtered_events_by_name_and_command = []

  triggered_events.each_with_index do |triggered_event, index|
    matched_events = scheduled_events[triggered_event.command_label]
    if matched_events && !matched_events.empty?
      filtered_events_by_name_and_command, unmatched_events = 
        filter_matched_events(matched_events, triggered_event)
      triggered_events[index] = nil
      remove_scheduled_event(unmatched_events, triggered_event.command_label)
    end
  end
  triggered_events.compact!

  filtered_events_by_name_and_command.each {|event| yield event }
end

#schedule_event(command_label, event_name = nil, &block) ⇒ Object

Schedule an Event. The event will only trigger when a scheduled event matches a triggered event.

Parameters:

  • command_label (String)

    Command for which the event should be triggered

  • event_name (String, nil) (defaults to: nil)

    Optional event name

  • block

    The block to execute when event actually triggers



31
32
33
34
35
# File 'lib/invoker/event/manager.rb', line 31

def schedule_event(command_label, event_name = nil, &block)
  @trigger_mutex.synchronize do
    scheduled_events[command_label] << OpenStruct.new(:event_name => event_name, :block => block)
  end
end

#trigger(command_label, event_name = nil) ⇒ Object

Trigger an event. The event is not triggered immediately, but is just scheduled to be triggered.

Parameters:

  • command_label (String)

    Command for which event should be triggered

  • event_name (Symbol, nil) (defaults to: nil)

    The optional event name



17
18
19
20
21
22
23
# File 'lib/invoker/event/manager.rb', line 17

def trigger(command_label, event_name = nil)
  @trigger_mutex.synchronize do
    triggered_events << OpenStruct.new(
      :command_label => command_label, 
      :event_name => event_name)
  end
end