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