Sha256: 2083b8efeae918ed6a58e803ab876b9c0550930f28702a119ba5d778c09188a0

Contents?: true

Size: 1.36 KB

Versions: 9

Compression:

Stored size: 1.36 KB

Contents

module Dragonfly
  module Delegator
    
    # This gets raised if no delegated objects are able to handle
    # the method call, even though they respond to that method.
    class UnableToHandle < StandardError; end
    
    def register(klass, *args, &block)
      object = klass.new(*args)
      object.configure(&block) if block
      registered_objects << object
    end
    
    def unregister(klass)
      registered_objects.delete_if{|obj| obj.is_a?(klass) }
    end
    
    def unregister_all
      self.registered_objects = []
    end
    
    def registered_objects
      @registered_objects ||= []
    end
    
    def callable_methods
      registered_objects.map{|a| a.delegatable_methods }.flatten.uniq
    end
    
    def has_callable_method?(method)
      callable_methods.include?(method.to_method_name)
    end
    
    private
    
    attr_writer :registered_objects
    
    def method_missing(meth, *args)
      registered_objects.reverse.each do |object|
        catch :unable_to_handle do
          return object.send(meth, *args) if object.respond_to?(meth)
        end
      end
      raise UnableToHandle, "None of the registered objects for #{self} were able to deal with the method call " +
        "#{meth}(#{args.map{|a| a.inspect[0..100]}.join(',')}), even though the method is implemented" if self.has_callable_method?(meth)
      super
    end
    
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
dragonfly-0.5.7 lib/dragonfly/delegator.rb
dragonfly-0.5.6 lib/dragonfly/delegator.rb
dragonfly-0.5.5 lib/dragonfly/delegator.rb
dragonfly-0.5.4 lib/dragonfly/delegator.rb
dragonfly-0.5.3 lib/dragonfly/delegator.rb
dragonfly-0.5.2 lib/dragonfly/delegator.rb
dragonfly-0.5.1 lib/dragonfly/delegator.rb
dragonfly-0.5.0 lib/dragonfly/delegator.rb
dragonfly-0.4.4 lib/dragonfly/delegator.rb