Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   manufacturing methods (http://www.velocityreviews.com/forums/t861483-manufacturing-methods.html)

Matthew Pounsett 02-01-2010 07:05 AM

manufacturing methods
 
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




Josh Cheek 02-01-2010 07:53 AM

Re: manufacturing methods
 
[Note: parts of this message were removed to make it a legal post.]

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



Here is a list of useful methods like this
http://weare.buildingsky.net/2009/08...amming-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.


Robert Klemme 02-01-2010 08:59 AM

Re: manufacturing methods
 
2010/2/1 Josh Cheek <josh.cheek@gmail.com>:
> On Mon, Feb 1, 2010 at 1:05 AM, Matthew Pounsett <matt@conundrum.com> wro=

te:
>
>> 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 variable=

s in
>> methods. =A0Not exactly what I'm looking for.
>>
>> The question I've got is related to manufacturing methods. =A0In my
>> particular case, I'm using a module that relies heavily on callback meth=

ods.
>> =A0I need to define a couple dozen callbacks which I'd like to all behav=

e in
>> basically the same way. =A0In order to keep my code simple, I thought I'=

d try
>> manufacturing them all from the same basic code.. but haven't found a sy=

ntax
>> 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 meth=

ods
>> "on_foo", "on_bar", and "on_baz":
>>
>> %w( foo bar baz ).each do |callback|
>> =A0 def on_#{callback}
>> =A0 =A0 =A0# callback work here
>> =A0 end
>> end
>>
>> Is what I'm attempting to do even possible?
>>
>> Thanks,
>> =A0Matt
>>
>>
>>
>>

> If you are in a class, you should can do:
>
> class Test
> =A0%w( foo bar baz ).each do |callback|
> =A0 =A0define_method "on_#{callback}" do |param|
> =A0 =A0 =A0puts "This is method #{callback}"
> =A0 =A0 =A0puts "I have received the parameter: #{param}"
> =A0 =A0 =A0puts
> =A0 =A0end
> =A0end
> end
>
>
> test =3D Test.new
> (test.methods - Object.methods).each_with_index do |method,index|
> =A0test.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=3D%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=3D%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_/ =3D~ s.to_s
printf "args=3D%p\n", a
else
super
end
end
end

Kind regards

robert

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/


Matthew Pounsett 02-02-2010 12:13 AM

Re: manufacturing methods
 

Thanks very much Robert and Josh for your suggestions. It looks like =
all of these work for what I need, so I'll just need to pick one.

Thanks!
Matt





All times are GMT. The time now is 08:00 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.