Check this tutorial/game/artwork out: http://poignantguide.net/dwemthy/ By the end, you will definitely know how to create methods that behave like attr_accessor. On 1/21/06, Gioele Barabucci <ml / gioelebarabucci.com> wrote: > 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 <dev / gioelebarabucci.com> > >