module DeferredAttributes
  def attr_deferred(name, &block)
    instance_variable_name = "@#{name}"
    define_method name do
      value = instance_variable_get(instance_variable_name)
      return value if value
      instance_variable_set(instance_variable_name, self.instance_eval(&block))
    end
  end
end