From: Raf Coremans Date: 2007-05-13T02:56:53+09:00 Subject: Re: copy methods from one module to another, with a twist 2007/5/11, David Chelimsky : > 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 > => # > irb(main):003:0> mod2 = Mod.new > => # > 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 > => # > irb(main):007:0> class Thing; end > => nil > irb(main):008:0> Thing.send :include, mod1 > => Thing > irb(main):009:0> t = Thing.new > => # > 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 > => # > > 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