Forwardable and SingleForwardable offer methods to forward (or delegate) method calls to a designated object.
Forwardable supports three methods of delegating methods: def_delegator, def_delegators and delegate.
def_delegator delegates single methods:
class User
extend Forwardable
def_delegator :@address, :street
def_delegator :@address, :city, :address_city
# basically defines:
#
# def street
# @address.street
# end
#
# def address_city
# @address.city
# end
enddef_delegators delegates several methods (using def_delegator):
class User
extend Forwardable
def_delegators :@address, :street, :city
# is basically the same as:
#
# def_delegator :@address, :street
# def_delegator :@address, :city
endWhen using def_delegators, the __send__ and __id__ methods are ignored so they are not overriden.
delegate delegates methods (using def_delegator):
class User
extend Forwardable
delegate :street => :@address
delegate :city => :@address
# or:
delegate [:street, :city] => :@address
# or:
delegate street: :@address, city: :@address
# is the same as:
#
# def_delegator :@address, :street
# def_delegator :@address, :city
endSingleForwardable works like Forwardable but on the object level:
user = User.new
user.extend(SingleForwardable)
user.def_delegator(:@address, :street)
user.def_delegator(:@address, :city)
# or
user.def_delegators(:@address, :street, :city)
# or
user.delegate([:street, :city] => :@address)