From: Raf Coremans Date: 2007-05-13T02:37:15+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 > 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) => # irb(main):018:0> class Other; end => nil irb(main):019:0> Other.send :include, mod2 => Other irb(main):020:0> o = Other.new => # irb(main):021:0> o.mod1_method => "I'm defined in mod1" Regards, Raf