Class Delegator
In: delegate.rb
Parent: Object

Delegator is an abstract class used to build delegator pattern objects from subclasses. Subclasses should redefine __getobj__. For a concrete implementation, see SimpleDelegator.

Methods

External Aliases

initialize -> initialize_methods

Public Class methods

Pass in the obj to delegate method calls to. All methods supported by obj will be delegated to.

[Source]

# File delegate.rb, line 123
  def initialize(obj)
    preserved = ::Kernel.public_instance_methods(false)
    preserved -= ["to_s","to_a","inspect","==","=~","==="]
    for t in self.class.ancestors
      preserved |= t.public_instance_methods(false)
      preserved |= t.private_instance_methods(false)
      preserved |= t.protected_instance_methods(false)
      break if t == Delegator
    end
    preserved << "singleton_method_added"
    for method in obj.methods
      next if preserved.include? method
      begin
        eval "def self.\#{method}(*args, &block)\nbegin\n__getobj__.__send__(:\#{method}, *args, &block)\nrescue Exception\n$@.delete_if{|s| /:in `__getobj__'$/ =~ s} #`\n$@.delete_if{|s| /^\\\\(eval\\\\):/ =~ s}\nKernel::raise\nend\nend\n"
      rescue SyntaxError
        raise NameError, "invalid identifier %s" % method, caller(4)
      end
    end
  end

Public Instance methods

This method must be overridden by subclasses and should return the object method calls are being delegated to.

[Source]

# File delegate.rb, line 177
  def __getobj__
    raise NotImplementedError, "need to define `__getobj__'"
  end

Serialization support for the object returned by __getobj__.

[Source]

# File delegate.rb, line 182
  def marshal_dump
    __getobj__
  end

Reinitializes delegation from a serialized object.

[Source]

# File delegate.rb, line 186
  def marshal_load(obj)
    initialize_methods(obj)
  end

Handles the magic of delegation through __getobj__.

[Source]

# File delegate.rb, line 156
  def method_missing(m, *args)
    target = self.__getobj__
    unless target.respond_to?(m)
      super(m, *args)
    end
    target.__send__(m, *args)
  end

Checks for a method provided by this the delegate object by fowarding the call through __getobj__.

[Source]

# File delegate.rb, line 168
  def respond_to?(m)
    return true if super
    return self.__getobj__.respond_to?(m)
  end

[Validate]