Sha256: 03b0cc05fea12151b0aa2391ac3e79a7255e5d1b4f26874c4f4c91c6f873e081

Contents?: true

Size: 1.74 KB

Versions: 12

Compression:

Stored size: 1.74 KB

Contents

module Callback
  class CallbackContainer
    def initialize
      @callback_registry = Hash.new do |hash, key|
        hash[key] = Array.new
      end
    end

    # Defines the callback with the key in this container.
    def define(key, callback_proc=nil, &callback_block)
      callback = extract_callback(callback_block, callback_proc) do
        raise "You must define the callback that accepts the call method."
      end
      @callback_registry[key] << callback
      callback
    end

    # Undefines the callback with the key in this container.
    def undefine(key, callback_proc)
      callback = extract_callback(callback_proc) do
        raise "You may only undefine callbacks that use the call method."
      end
      @callback_registry[key].delete callback
      callback
    end

    # Notifies the callbacks for the key. Arguments may be passed.
    # An error handler may be passed in as a block. If there is an error, the block is called with
    # error object as an argument.
    # An array of the return values of the callbacks is returned.
    def notify(key, *args, &error_handler)
      @callback_registry[key].collect do |callback|
        begin
          callback.call(*args)
        rescue Exception => e
          yield(e) if error_handler
        end
      end
    end

    # Clears all of the callbacks in this container.
    def clear
      @callback_registry.clear
    end

    protected
    def extract_callback(first_choice_callback, second_choice_callback = nil)
      callback = nil
      if first_choice_callback
        callback = first_choice_callback
      elsif second_choice_callback
        callback = second_choice_callback
      end
      unless callback.respond_to? :call
        yield
      end
      return callback
    end
  end
end

Version data entries

12 entries across 12 versions & 4 rubygems

Version Path
callback-0.5.0 lib/callback/callback_container.rb
puppet-0.23.0 test/lib/spec/callback/callback_container.rb
puppet-0.22.4 test/lib/spec/callback/callback_container.rb
puppet-0.23.2 test/lib/spec/callback/callback_container.rb
puppet-0.23.1 test/lib/spec/callback/callback_container.rb
riess-0.0.8 vendor/rspec-0.8.2/lib/spec/callback/callback_container.rb
rspec-0.7.4 lib/spec/callback/callback_container.rb
rspec-0.7.5.1 lib/spec/callback/callback_container.rb
rspec-0.8.1 lib/spec/callback/callback_container.rb
rspec-0.8.0 lib/spec/callback/callback_container.rb
rspec-0.7.5 lib/spec/callback/callback_container.rb
rspec-0.8.2 lib/spec/callback/callback_container.rb