Sha256: 01d6bdbeb977134db68c3e9e773fd5a16f8281ba2c17e0f49941336182565846
Contents?: true
Size: 1.26 KB
Versions: 3
Compression:
Stored size: 1.26 KB
Contents
require "thread_safe" module Houston class Observer def initialize @async = true clear! end attr_accessor :async def on(event, &block) observers_of(event).push(block) nil end def once(event, &block) wrapped_block = Proc.new do |*args| block.call(*args) observers_of(event).delete wrapped_block end on(event, &wrapped_block) end def observed?(event) observers_of(event).any? end def fire(event, *args) invoker = async ? method(:invoke_callback_async) : method(:invoke_callback) observers_of(event).each do |block| invoker.call(event, block, *args) end nil end def clear! @observers = {} end private def invoke_callback_async(event, block, *args) Houston.async do invoke_callback(event, block, *args) end end def invoke_callback(event, block, *args) block.call(*args) rescue Exception # rescues StandardError by default; but we want to rescue and report all errors $!.additional_information[:event] = event Houston.report_exception($!) end def observers_of(event) observers[event] ||= ThreadSafe::Array.new end attr_reader :observers end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
houston-core-0.7.0.beta3 | lib/houston/boot/observer.rb |
houston-core-0.7.0.beta2 | lib/houston/boot/observer.rb |
houston-core-0.7.0.beta | lib/houston_observer.rb |