In Files

  • forwardable.rb

Class/Module Index [+]

Quicksearch

Forwardable

The Forwardable module provides delegation of specified methods to a designated object, using the methods def_delegator and def_delegators.

For example, say you have a class RecordCollection which contains an array @records. You could provide the lookup method record_number(), which simply calls [] on the @records array, like this:

class RecordCollection
  extend Forwardable
  def_delegator :@records, :[], :record_number
end

Further, if you wish to provide the methods size, <<, and map, all of which delegate to @records, this is how you can do it:

class RecordCollection
  # extend Forwardable, but we did that above
  def_delegators :@records, :size, :<<, :map
end

Also see the example at forwardable.rb.

Attributes

debug[RW]

force Forwardable to show up in stack backtraces of delegated methods

Public Instance Methods

def_delegator(accessor, method, ali = method) click to toggle source
def_delegators(accessor, *methods) click to toggle source
def_instance_delegator(accessor, method, ali = method) click to toggle source

Defines a method method which delegates to obj (i.e. it calls the method of the same name in obj). If new_name is provided, it is used as the name for the delegate method.

See the examples at Forwardable and forwardable.rb.

 
               # File forwardable.rb, line 143
  def def_instance_delegator(accessor, method, ali = method)
    accessor = accessor.id2name if accessor.kind_of?(Integer)
    method = method.id2name if method.kind_of?(Integer)
    ali = ali.id2name if ali.kind_of?(Integer)

    module_eval("      def #{ali}(*args, &block)
        begin
          #{accessor}.__send__(:#{method}, *args, &block)
        rescue Exception
          $@.delete_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug
          Kernel::raise
        end
      end
", "(__FORWARDABLE__)", 1)
  end
            
Also aliased as: def_delegator
def_instance_delegators(accessor, *methods) click to toggle source

Shortcut for defining multiple delegator methods, but with no provision for using a different name. The following two code samples have the same effect:

def_delegators :@records, :size, :<<, :map

def_delegator :@records, :size
def_delegator :@records, :<<
def_delegator :@records, :map

See the examples at Forwardable and forwardable.rb.

 
               # File forwardable.rb, line 130
def def_instance_delegators(accessor, *methods)
  for method in methods
    def_instance_delegator(accessor, method)
  end
end
            
Also aliased as: def_delegators

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus