Inheritance problem with dynamic methods

Hello,

I'm tying to create a method which would allow me to get and set
instance variables having the same name as the class. And this should be
true even for classes inheriting it.

For instance

[code]
class Mother
         define_method(self.to_s.downcase){ instance_variable_get
'@'<<self.class.to_s.downcase }
         define_method((self.to_s.downcase+'=').to_sym){|nom|
instance_variable_set '@'<<self.class.to_s.downcase, nom}
end
class Daughter < Mother
end
[/code]

At the moment, this code creates "mother" and "mother=" instance methods
for both Mother and Daughter's classes.
Instead, what I'd like to have in a "mother" and "mother=" instance
methods for Mother, and "daughter" and "daughter=" for Daughter.

I think that there is some meta programming trick that I'm missing but I
can't find which one.

Could you help me?

···

--
Posted via http://www.ruby-forum.com/.

Hi --

Hello,

I'm tying to create a method which would allow me to get and set
instance variables having the same name as the class. And this should be
true even for classes inheriting it.

For instance

[code]
class Mother
        define_method(self.to_s.downcase){ instance_variable_get
'@'<<self.class.to_s.downcase }
        define_method((self.to_s.downcase+'=').to_sym){|nom|
instance_variable_set '@'<<self.class.to_s.downcase, nom}
end
class Daughter < Mother
end
[/code]

At the moment, this code creates "mother" and "mother=" instance methods
for both Mother and Daughter's classes.
Instead, what I'd like to have in a "mother" and "mother=" instance
methods for Mother, and "daughter" and "daughter=" for Daughter.

I think that there is some meta programming trick that I'm missing but I
can't find which one.

One metaprogramming trick you could use is attr_accessor :slight_smile: Another
is the "inherited" hook. Try this:

class Mother
   def self.attr_eponymous(c=self)
     c.send(:attr_accessor, c.to_s.downcase)
   end

   def self.inherited(c)
     attr_eponymous(c)
   end

   attr_eponymous
end

David

···

On Tue, 21 Jul 2009, Stefano Grioni wrote:

--
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (http://manning.com/black2\)
Training! Intro to Ruby, with Black & Kastner, September 14-17
(More info: http://rubyurl.com/vmzN\)

David A. Black wrote:

Hi --

        define_method(self.to_s.downcase){ instance_variable_get
Instead, what I'd like to have in a "mother" and "mother=" instance
methods for Mother, and "daughter" and "daughter=" for Daughter.

I think that there is some meta programming trick that I'm missing but I
can't find which one.

One metaprogramming trick you could use is attr_accessor :slight_smile: Another
is the "inherited" hook. Try this:

class Mother
   def self.attr_eponymous(c=self)
     c.send(:attr_accessor, c.to_s.downcase)
   end

   def self.inherited(c)
     attr_eponymous(c)
   end

   attr_eponymous
end

David

Hi,

Your solution is brilliant :smiley:
I must admit that I was so sure that the solution would come of some
weird twist of a singleton method that I completely skipped the
"inherited" hook ...

Thanks a lot!

···

On Tue, 21 Jul 2009, Stefano Grioni wrote:

--
Posted via http://www.ruby-forum.com/\.