From: Josh Cheek Date: 2010-02-01T16:53:27+09:00 Subject: Re: manufacturing methods --001636b2ae2cb2ab56047e8547d4 Content-Type: text/plain; charset=ISO-8859-1 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 Here is a list of useful methods like this http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox 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. --001636b2ae2cb2ab56047e8547d4--