Here is another alternative approach that you can look at. This is not as elegant as what you are trying to do using define_method , but it might be worth a look.
Add new lazy_attr_reader method to Class
class Class def lazy_attr_reader(*vars) options = vars.last.is_a?(::Hash) ? vars.pop : {}
Then use it as follows:
class Test lazy_attr_reader :name, :via => "name_loader" def name_loader @name = "Bob" end end
In action:
irb(main):145:0> t = Test.new => #<Test:0x2d6291c> irb(main):146:0> t.name => "Bob"
mikej source share