From: Robert Klemme Date: 2010-02-01T17:59:42+09:00 Subject: Re: manufacturing methods 2010/2/1 Josh Cheek : > On Mon, Feb 1, 2010 at 1:05 AM, Matthew Pounsett 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 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 -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/