class Bluepill::Trigger

Attributes

logger[RW]
mutex[RW]
process[RW]
scheduled_events[RW]

Public Class Methods

[](name) click to toggle source
# File lib/bluepill/trigger.rb, line 8
def self.[](name)
  @implementations[name]
end
inherited(klass) click to toggle source
# File lib/bluepill/trigger.rb, line 4
def self.inherited(klass)
  @implementations[klass.name.split('::').last.underscore.to_sym] = klass
end
new(process, options = {}) click to toggle source
# File lib/bluepill/trigger.rb, line 14
def initialize(process, options = {})
  self.process = process
  self.logger = options[:logger]
  self.mutex = Mutex.new
  self.scheduled_events = []
end

Public Instance Methods

cancel_all_events() click to toggle source
# File lib/bluepill/trigger.rb, line 51
def cancel_all_events
  logger.info 'Canceling all scheduled events'
  mutex.synchronize do
    scheduled_events.each { |_, thread| thread.kill }
  end
end
dispatch!(event) click to toggle source
# File lib/bluepill/trigger.rb, line 29
def dispatch!(event)
  process.dispatch!(event, self.class.name.split('::').last)
end
notify(_transition) click to toggle source
# File lib/bluepill/trigger.rb, line 25
def notify(_transition)
  raise 'Implement in subclass'
end
reset!() click to toggle source
# File lib/bluepill/trigger.rb, line 21
def reset!
  cancel_all_events
end
schedule_event(event, delay) click to toggle source
# File lib/bluepill/trigger.rb, line 33
def schedule_event(event, delay)
  # TODO: maybe wrap this in a ScheduledEvent class with methods like cancel
  thread = Thread.new(self) do |trigger|
    begin
      sleep delay.to_f
      trigger.dispatch!(event)
      trigger.mutex.synchronize do
        trigger.scheduled_events.delete_if { |_, t| t == Thread.current }
      end
    rescue StandardError => e
      trigger.logger.err(e)
      trigger.logger.err(e.backtrace.join("\n"))
    end
  end

  scheduled_events.push([event, thread])
end