diff --git a/lib/uber/inheritable_attr.rb b/lib/uber/inheritable_attr.rb index a96539a..b6c65b9 100644 --- a/lib/uber/inheritable_attr.rb +++ b/lib/uber/inheritable_attr.rb @@ -2,16 +2,20 @@ module Uber module InheritableAttr def inheritable_attr(name, options={}) - instance_eval <<-RUBY, __FILE__, __LINE__ + 1 - def #{name}=(v) - @#{name} = v - end - - def #{name} - return @#{name} if instance_variable_defined?(:@#{name}) - @#{name} = InheritableAttribute.inherit_for(self, :#{name}, #{options}) - end - RUBY + name = name.to_s + variable = "@#{name}" + instance_variable_defined?(variable) # validate the name + method = name.to_sym + options = options.dup + + define_singleton_method(:"#{name}=") do |value| + instance_variable_set(variable, value) + end + + define_singleton_method(method) do + return instance_variable_get(variable) if instance_variable_defined?(variable) + instance_variable_set(variable, InheritableAttribute.inherit_for(self, method, options)) + end end def self.inherit_for(klass, name, options={})