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