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_ .

Constant Summary

Constants inherited from Delegator

Delegator::IgnoreBacktracePat

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.



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

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.



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

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)


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

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_.



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

def clone
  new = super
  new.__setobj__(__getobj__.clone)
  new
end

#dupObject

Duplication support for the object returned by _getobj_.



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

def dup
  new = super
  new.__setobj__(__getobj__.clone)
  new
end