Module | OpenStructable |
In: |
lib/more/facets/ostructable.rb
|
OpensStructable is a mixin module which can provide OpenStruct behavior to any class or object. OpenStructable allows extention of data objects with arbitrary attributes.
require 'mega/ostructable' class Record include OpenStructable end record = Record.new record.name = "John Smith" record.age = 70 record.pension = 300 puts record.name # -> "John Smith" puts record.address # -> nil
# File lib/more/facets/ostructable.rb, line 64 def initialize(hash=nil) @__table__ = {} if hash for k,v in hash @__table__[k.to_sym] = v new_ostruct_member(k) end end end
Compare this object and other for equality.
# File lib/more/facets/ostructable.rb, line 157 def ==(other) return false unless(other.kind_of?(OpenStruct)) return @__table__ == other.table end
Remove the named field from the object.
# File lib/more/facets/ostructable.rb, line 135 def delete_field(name) @__table__ ||= {} @__table__.delete name.to_sym end
duplicate an OpenStruct object members.
# File lib/more/facets/ostructable.rb, line 75 def initialize_copy(orig) super @__table__ = @__table__.dup end
Returns a string containing a detailed summary of the keys and values.
# File lib/more/facets/ostructable.rb, line 143 def inspect str = "<#{self.class}" for k,v in (@__table__ ||= {}) str << " #{k}=#{v.inspect}" end str << ">" end
# File lib/more/facets/ostructable.rb, line 83 def marshal_load(x) @table = x @table.each_key{|key| new_ostruct_member(key)} end
# File lib/more/facets/ostructable.rb, line 88 def new_ostruct_member(name) unless self.respond_to?(name) self.instance_eval %{ def #{name}; @__table__[:#{name}]; end def #{name}=(x); @__table__[:#{name}] = x; end } end end