From: Robert Klemme Date: 2008-10-20T17:33:11+09:00 Subject: Re: Proc metaprogramming tricks? 2008/10/19 Adam Skobi : > >> class C >> def self.inherited(klass) >> klass_name = klass.name[/[^:]+$/] >> klass.to_s.split(/::/)[0...-1].inject(Object) { |const, name| >> const.const_get name >> }.send :remove_const, klass_name >> C.const_set klass_name, klass >> end >> end > >> NB: Don't do this. > > Yes! Why haven't I thought of this solution?! > Thanks for that one. > > Are the any non obvious reasons as why not to do this type of trick > (code obfuscation, maintance hell etc.)? Yes, there's a reason: it does not work: 10:17:43 Temp$ ruby mod.rb initial A::X A::X after remove A::X A::X after set A::X A::X 10:17:51 Temp$ cat mod.rb module A class X end end $cl = ::A::X puts "initial", $cl, $cl.name A.send :remove_const, 'X' puts "after remove", $cl, $cl.name module B end B.send :const_set, 'Y', $cl puts "after set", $cl, $cl.name 10:18:08 Temp$ Here's one way to do it: class Root # features all objects of dsl share class Object def my_name # silly example self.class.name end end class <