OpensStructable is a mixin module which can provide OpenStruct behavior to any class or object. OpenStructable allows extention of data objects with arbitrary attributes.
Usage
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
Author(s)
- Thomas Sawyer
- Yukihiro Matsumoto
- Gavin Sinclair (Documentation)
Methods
==
delete_field
initialize_copy
inspect
marshal_dump
marshal_load
new
new_ostruct_member
update
Public Class methods
[ + ]
# 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
Public Instance methods
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 80 def marshal_dump @table 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
Generate additional attributes and values.
[ + ]
# File lib/more/facets/ostructable.rb, line 100 def update(hash) @__table__ ||= {} if hash for k,v in hash @__table__[k.to_sym] = v new_ostruct_member(k) end end end