From: Gioele Barabucci Date: 2006-01-22T07:28:28+09:00 Subject: class methods like attr: How can I create methods like "attr:" that can create methods and instance variables? I'd like to do this class B < A my_property :k, "K" def test p @k # should print "K" p @@my_properties # should print ['k'] end end I tried with this (non-) solution class A def A.my_property(sym, val) self.instance_eval { @@my_properties ||= Array.new() @@my_properties << sym.to_s eval "@#{sym.id2name} = \"#{val}\"" # p @k1 # << this shows "K1.B" or "K1.C" as expected } end end but these tests showed me that I was wrong class A def test p @@my_properties end end class B < A my_property :k1, "K1.B" # k1 is a string fixed to "K1" my_property :k2, "K2.B" def test super # should be ['k1', 'k2'] p @k1 # should be "K1" end end class C < A my_property :k1, "K1.C" def test super # should be ['k1'] p @k1 # should be "K1.C" end end A.new.test (should print nil or a warning) => ["k1", "k2", "k1"] B.new.test (should print ['k1', 'k2'] 'K1.B') => ["k1", "k2", "k1"] ./at.rb:28: warning: instance variable @k1 not initialized nil A.new.test (should print nil or a warning) => ["k1", "k2", "k1"] C.new.test (should print ['k1'] 'K1.C') => ["k1", "k2", "k1"] ./at.rb:36: warning: instance variable @k1 not initialized nil Any suggestion or idea? -- Gioele