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 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
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 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