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.
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
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
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 see Improve the docs, or visit Documenting-ruby.org.