Is there an easy way to extend an object?

Given an object, is there a clean way of creating a new object that
wraps the original and then adds a new method?

It doesn’t have to wrap the old object if there’s a way to directly add
a new method to the object (I’m allowed to change the incoming object).

def extend_it(obj)

how do I add a method to obj

or create a wrapper for it?

return obj #or new_obj that quacks like obj, has obj data, and also
has extra method

end

In my C++ days I would create a class that derives from the original
class, extends it with a new method, and defines a copy constructor to
copy the state of the original object.

Thanks
Jeff

Hi –

On Wed, 28 Dec 2005, Jeff C. wrote:

Given an object, is there a clean way of creating a new object that
wraps the original and then adds a new method?

It doesn’t have to wrap the old object if there’s a way to directly add
a new method to the object (I’m allowed to change the incoming object).

def extend_it(obj)

how do I add a method to obj

or create a wrapper for it?

You can directly define a method on a particular object:

def obj.new_method

end

You can also create a module, and then use ‘extend’ to add that
module’s instance method’s to the object’s capabilities.

module M
def x
end
end
obj.extend(M)

There are a few more variants on these if they’re not what you
need…

David


David A. Black
[email protected]

“Ruby for Rails”, from Manning Publications, coming April 2006!

unknown wrote:

You can directly define a method on a particular object:

def obj.new_method

end

That worked great! Thanks.

Jeff

Jeff C. [email protected] wrote:

Jeff
Just for the sake of completeness: if you are not allowed to modify the
original instance or do not want to do it there’s a delegator module:

require ‘delegate’
=> true
s=“foo”
=> “foo”
o=SimpleDelegater.new s
=> “foo”
o.length
=> 3
def o.foo() length * 2 end
=> nil
o.foo
=> 6
o << “bar”
=> “foobar”
o.length
=> 6
o.foo
=> 12

Kind regards

robert

Robert K. wrote:

Just for the sake of completeness: if you are not allowed to modify the
original instance or do not want to do it there’s a delegator module:

Now that is also really cool. Ruby is my first “dynamic” language and
I’m starting to see how powerful it can be.

Thanks for the tip.

Jeff

Jeff…

In a more-or-less “pure” OO language like Ruby (or Smalltalk), you
don’t have to go through all those gyrations that C++ (and other
languages that added OO after the fact) forced us to use. You just
add a method to the existing object because classes are first-class
objects.

Cool, eh?

On Dec 27, 2005, at 5:40 PM, Jeff C. wrote:

how do I add a method to obj

Thanks
Jeff


Posted via http://www.ruby-forum.com/.

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
Dan S.
Technology Visionary - Technology Assessment - Documentation
“Looking at technology from every angle”