Apologies if this is covered somewhere... all the googling I've done on the subject has wound up with info on class-factories and and using variables in methods. Not exactly what I'm looking for.
The question I've got is related to manufacturing methods. In my particular case, I'm using a module that relies heavily on callback methods. I need to define a couple dozen callbacks which I'd like to all behave in basically the same way. In order to keep my code simple, I thought I'd try manufacturing them all from the same basic code.. but haven't found a syntax that works.
Though this syntax clearly doesn't work, an example of the sort of thing I'm looking for might look like this, assuming I want to create the methods "on_foo", "on_bar", and "on_baz":
%w( foo bar baz ).each do |callback|
def on_#{callback}
# callback work here
end
end
class Test
%w( foo bar baz ).each do |callback|
define_method "on_#{callback}" do |param|
puts "This is method #{callback}"
puts "I have received the parameter: #{param}"
puts
end
end
end
test = Test.new
(test.methods - Object.methods).each_with_index do |method,index|
test.send method , index
end
They are a bit cumbersome to use, though. For example, I don't know how to
set it up to receive a block, and you can't use them certain places.
···
On Mon, Feb 1, 2010 at 1:05 AM, Matthew Pounsett <matt@conundrum.com> wrote:
Hi there.
Apologies if this is covered somewhere... all the googling I've done on the
subject has wound up with info on class-factories and and using variables in
methods. Not exactly what I'm looking for.
The question I've got is related to manufacturing methods. In my
particular case, I'm using a module that relies heavily on callback methods.
I need to define a couple dozen callbacks which I'd like to all behave in
basically the same way. In order to keep my code simple, I thought I'd try
manufacturing them all from the same basic code.. but haven't found a syntax
that works.
Though this syntax clearly doesn't work, an example of the sort of thing
I'm looking for might look like this, assuming I want to create the methods
"on_foo", "on_bar", and "on_baz":
%w( foo bar baz ).each do |callback|
def on_#{callback}
# callback work here
end
end
In this case there is a much simpler solution which does not need
metaprogramming:
class X
def on_event_impl(*a)
printf "args=%p\n", a
end
alias foo on_event_impl
alias bar on_event_impl
alias baz on_event_impl
end
If you want to use a bit of metaprogramming in order to not repeat you can do:
class Y
def on_event_impl(*a)
printf "args=%p\n", a
end
%w{foo bar baz}.each {|m| alias_method m, :on_event_impl}
end
Yet another option is to use #method_missing
class Z
def method_missing(s, *a, &b)
if /\Aon_/ =~ s.to_s
printf "args=%p\n", a
else
super
end
end
end
Kind regards
robert
···
2010/2/1 Josh Cheek <josh.cheek@gmail.com>:
On Mon, Feb 1, 2010 at 1:05 AM, Matthew Pounsett <matt@conundrum.com> wrote:
Hi there.
Apologies if this is covered somewhere... all the googling I've done on the
subject has wound up with info on class-factories and and using variables in
methods. Not exactly what I'm looking for.
The question I've got is related to manufacturing methods. In my
particular case, I'm using a module that relies heavily on callback methods.
I need to define a couple dozen callbacks which I'd like to all behave in
basically the same way. In order to keep my code simple, I thought I'd try
manufacturing them all from the same basic code.. but haven't found a syntax
that works.
Though this syntax clearly doesn't work, an example of the sort of thing
I'm looking for might look like this, assuming I want to create the methods
"on_foo", "on_bar", and "on_baz":
%w( foo bar baz ).each do |callback|
def on_#{callback}
# callback work here
end
end
Is what I'm attempting to do even possible?
Thanks,
Matt
If you are in a class, you should can do:
class Test
%w( foo bar baz ).each do |callback|
define_method "on_#{callback}" do |param|
puts "This is method #{callback}"
puts "I have received the parameter: #{param}"
puts
end
end
end
test = Test.new
(test.methods - Object.methods).each_with_index do |method,index|
test.send method , index
end