Is there an easy way to extend an object?


#1

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


#2

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
removed_email_address@domain.invalid

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


#3

unknown wrote:

You can directly define a method on a particular object:

def obj.new_method

end

That worked great! Thanks.

Jeff


#4

Jeff C. removed_email_address@domain.invalid 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

#5

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
www.softiesonrails.com


#6

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”
http://www.eclecticity.com