[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

copy methods from one module to another, with a twist

David Chelimsky

5/11/2007 12:45:00 PM

Hi all. I'm trying to figure out how to copy methods from one module
to another (actually subclasses of Module because I don't want to
actually extend Module in this context) and I could use some help.

The following works fine.

irb(main):001:0> class Mod < Module; end
=> nil
irb(main):002:0> mod1 = Mod.new
=> #<Mod:0x6108>
irb(main):003:0> mod2 = Mod.new
=> #<Mod:0x89198>
irb(main):004:0> mod1.send :define_method, :mod1_method do
irb(main):005:1* "I'm defined in mod1"
irb(main):006:1> end
=> #<Proc:0x0007d780@(irb):4>
irb(main):007:0> class Thing; end
=> nil
irb(main):008:0> Thing.send :include, mod1
=> Thing
irb(main):009:0> t = Thing.new
=> #<Thing:0x67034>
irb(main):010:0> t.mod1_method
=> "I'm defined in mod1"

What I have to do, however, is more complex. I need to copy
#mod1_method to mod2, and I only have access to the two modules when I
want to do this (not the classes/objects that include them). So,
adding to the above ...

irb(main):011:0> class Other; end
=> nil
irb(main):012:0> Other.send :include, mod2
=> Other
irb(main):013:0> o = Other.new
=> #<Other:0x57ad0>

I want to get from here to the following:

o.mod1_method

I've tried these approaches:

mod2.send :include, :mod1
mod2.send :extend, :mod1

What's the right way to do this?

Thanks,
David

2 Answers

Raf Coremans

5/12/2007 5:37:00 PM

0

2007/5/11, David Chelimsky <dchelimsky@gmail.com>:
> Hi all. I'm trying to figure out how to copy methods from one module
> to another (actually subclasses of Module because I don't want to
> actually extend Module in this context) and I could use some help.
>
> The following works fine.
>
> irb(main):001:0> class Mod < Module; end
> => nil
> irb(main):002:0> mod1 = Mod.new
> => #<Mod:0x6108>
> irb(main):003:0> mod2 = Mod.new
> => #<Mod:0x89198>
> irb(main):004:0> mod1.send :define_method, :mod1_method do
> irb(main):005:1* "I'm defined in mod1"
> irb(main):006:1> end
> => #<Proc:0x0007d780@(irb):4>
> irb(main):007:0> class Thing; end
> => nil
> irb(main):008:0> Thing.send :include, mod1
> => Thing
> irb(main):009:0> t = Thing.new
> => #<Thing:0x67034>
> irb(main):010:0> t.mod1_method
> => "I'm defined in mod1"
>
> What I have to do, however, is more complex. I need to copy
> #mod1_method to mod2, and I only have access to the two modules when I
> want to do this (not the classes/objects that include them). So,
> adding to the above ...
>
> irb(main):011:0> class Other; end
> => nil
> irb(main):012:0> Other.send :include, mod2
> => Other
> irb(main):013:0> o = Other.new
> => #<Other:0x57ad0>
>
> I want to get from here to the following:
>
> o.mod1_method
>
> I've tried these approaches:
>
> mod2.send :include, :mod1
> mod2.send :extend, :mod1
>
> What's the right way to do this?
>
> Thanks,
> David
>

Before including module mod2 in class Other, extend module mod2 with
the "included" callback:

irb(main):011:0> Mod1 = mod1 #Must start with capital apparently;
otherwise, fails later on
=> Mod1
irb(main):012:0> module TempIncludeMod1
irb(main):013:1> def included( klass)
irb(main):014:2> klass.send :include, Mod1
irb(main):015:2> end
irb(main):016:1> end
=> nil
irb(main):017:0> mod2.extend( TempIncludeMod1)
=> #<Mod:0x2b0ef9273520>
irb(main):018:0> class Other; end
=> nil
irb(main):019:0> Other.send :include, mod2
=> Other
irb(main):020:0> o = Other.new
=> #<Other:0x2b0ef91f26f0>
irb(main):021:0> o.mod1_method
=> "I'm defined in mod1"

Regards,
Raf

Raf Coremans

5/12/2007 5:57:00 PM

0

2007/5/11, David Chelimsky <dchelimsky@gmail.com>:
> Hi all. I'm trying to figure out how to copy methods from one module
> to another (actually subclasses of Module because I don't want to
> actually extend Module in this context) and I could use some help.
>
> The following works fine.
>
> irb(main):001:0> class Mod < Module; end
> => nil
> irb(main):002:0> mod1 = Mod.new
> => #<Mod:0x6108>
> irb(main):003:0> mod2 = Mod.new
> => #<Mod:0x89198>
> irb(main):004:0> mod1.send :define_method, :mod1_method do
> irb(main):005:1* "I'm defined in mod1"
> irb(main):006:1> end
> => #<Proc:0x0007d780@(irb):4>
> irb(main):007:0> class Thing; end
> => nil
> irb(main):008:0> Thing.send :include, mod1
> => Thing
> irb(main):009:0> t = Thing.new
> => #<Thing:0x67034>
> irb(main):010:0> t.mod1_method
> => "I'm defined in mod1"
>
> What I have to do, however, is more complex. I need to copy
> #mod1_method to mod2, and I only have access to the two modules when I
> want to do this (not the classes/objects that include them). So,
> adding to the above ...
>
> irb(main):011:0> class Other; end
> => nil
> irb(main):012:0> Other.send :include, mod2
> => Other
> irb(main):013:0> o = Other.new
> => #<Other:0x57ad0>
>
> I want to get from here to the following:
>
> o.mod1_method
>
> I've tried these approaches:
>
> mod2.send :include, :mod1
> mod2.send :extend, :mod1
>
> What's the right way to do this?
>
> Thanks,
> David
>

Erm, actually forget my previous reply, it's all much simpler: simply
include module Mod1 in module Mod2 before including module Mod2 in
class Other:

module Mod1
def mod1_method
"I'm defined in Mod1"
end
end

module Mod2
include Mod1
end

class Thing
include Mod1
end

class Other
include Mod2
end

p Thing.new.mod1_method # => "I'm defined in Mod1"
p Other.new.mod1_method # => "I'm defined in Mod1"

Remark that there is no need to subclass Module in fact, because
you're not at all extending class Module.


Regards,
Raf