Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 7 additions & 20 deletions lib/closed_struct.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

# Like OpenStruct, but raises an exception if you try to access a member that wasn't specified in the initializer.
class ClosedStruct < OpenStruct

def self.r_new(hash)
closed_struct = ClosedStruct.new(hash)
closed_struct.send(:recursive_initialize)
closed_struct
end

def initialize(*args)
if args.length == 1 and args.first.kind_of?(Hash)
super(args.first)
Expand All @@ -18,35 +18,22 @@ def initialize(*args)
else
raise ArgumentError, "invalid arguments: #{args.inspect}"
end
@closed = true
end

def new_ostruct_member(name)
if @closed
raise RuntimeError, "cannot add members to closed struct"
else
super
end
end

def method_missing(name, *args)
raise NoMethodError, "undefined method '#{name}' for #{self}"
end

def id
if @table.has_key?(:id)
@table[:id]
else
method_missing(:id)
end
end

def to_h
@table.dup
end

private

def recursive_initialize
@table.each do |k, v|
if v.kind_of?(Hash)
Expand All @@ -56,5 +43,5 @@ def recursive_initialize
end
end
end

end