Skip to content

Instantly share code, notes, and snippets.

@MyExperiments
Created February 19, 2014 14:50
Show Gist options
  • Save MyExperiments/9093607 to your computer and use it in GitHub Desktop.
Save MyExperiments/9093607 to your computer and use it in GitHub Desktop.
class DynamicAttrAccessor
def initialize(hash)
hash.each do |k,v|
if v.is_a?(Hash)
set_attr_accessor(k.to_s, self.class.new(v))
else
set_attr_accessor(k.to_s, v)
end
end
end
private
def set_attr_accessor(k,v)
singleton_class.class_eval do; attr_accessor k.to_s ; end
send("#{k}=", v)
end
end
# Here is an example
hash = {:p => 1, :q => 2, :r => {:s => 3, :t => 4}}
dynamic_attr_accessor = DynamicAttrAccessor.new(hash)
# => #<DynamicAttrAccessor:0x9392548 @p=1, @q=2, @r=#<DynamicAttrAccessor:0x939232c @s=3, @t=4>>
dynamic_attr_accessor.p
# => 1
dynamic_attr_accessor.r
# => #<DynamicAttrAccessor:0x939232c @s=3, @t=4>
dynamic_attr_accessor.r.t
# => 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment