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

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

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?

David A. Black wrote:

Hi –

On Tue, 21 Jul 2009, Stefano G. wrote:

    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©
attr_eponymous©
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!

Hi –

On Tue, 21 Jul 2009, Stefano G. wrote:

    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©
attr_eponymous©
end

attr_eponymous
end

David