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