I want to create a class method which allows us to create further class
methods, so something like:
class Test
class << self
def create_method(name, proc)
self.class.send(:define_method, name, proc)
end
end
end
proc = lambda {puts ‘Hello world’}
Test.create_method(:foo, proc)
Test.foo #want this
Integer.foo #don’t want this
The problem with the above is that create_method adds foo to all
classes. self.send on its own doesn’t seem to do what I want - it adds
foo as instance method instead.
The method will eventually be placed in an module to be mixed in when
desired, although I don’t think that matters here.
Ideas?
Hi –
On Wed, 1 Jul 2009, Shak Shak wrote:
proc = lambda {puts ‘Hello world’}
Test.create_method(:foo, proc)
Test.foo #want this
Integer.foo #don’t want this
The problem with the above is that create_method adds foo to all
classes. self.send on its own doesn’t seem to do what I want - it adds
foo as instance method instead.
There are three candidates for the class to which you might send the
:define_method message:
- Test
- Class
- the singleton class of Test
#3 is the one you want. The code you’ve written sends the message to
Class, and the self.send that you’ve tried sends it to Test.
Try this:
class Test
def self.create_method(name, proc)
s_class = class << self; self; end
s_class.send(:define_method, name, proc)
end
end
There are other ways (including using class_eval), but that’s the
general idea.
David