Class: SimpleDelegator

Inherits:
Delegator show all
Defined in:
lib/delegate.rb

Overview

A concrete implementation of Delegator, this class provides the means to delegate all supported method calls to the object passed into the constructor and even to change the object being delegated to at a later time with __setobj__ .

Instance Method Summary collapse

Methods inherited from Delegator

#marshal_dump, #marshal_load, #method_missing, #respond_to?

Constructor Details

#initialize(obj) ⇒ SimpleDelegator

Pass in the obj you would like to delegate method calls to.



200
201
202
203
# File 'lib/delegate.rb', line 200

def initialize(obj)
  super
  @_sd_obj = obj
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Delegator

Instance Method Details

#__getobj__Object

Returns the current object method calls are being delegated to.



206
207
208
# File 'lib/delegate.rb', line 206

def __getobj__
  @_sd_obj
end

#__setobj__(obj) ⇒ Object

Changes the delegate object to obj.

It’s important to note that this does not cause SimpleDelegator’s methods to change. Because of this, you probably only want to change delegation to objects of the same type as the original delegate.

Here’s an example of changing the delegation object.

names = SimpleDelegator.new(%w{James Edward Gray II})
puts names[1]    # => Edward
names.__setobj__(%w{Gavin Sinclair})
puts names[1]    # => Sinclair

Raises:

  • (ArgumentError)


224
225
226
227
# File 'lib/delegate.rb', line 224

def __setobj__(obj)
  raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
  @_sd_obj = obj
end

#cloneObject

Clone support for the object returned by __getobj__.



230
231
232
233
# File 'lib/delegate.rb', line 230

def clone
  super
  __setobj__(__getobj__.clone)
end

#dup(obj) ⇒ Object

Duplication support for the object returned by __getobj__.



235
236
237
238
# File 'lib/delegate.rb', line 235

def dup(obj)
  super
  __setobj__(__getobj__.dup)
end