def method_missing sym, *args, &block
name = sym.to_s.chomp('=').to_sym
result = nil
if name.to_s =~ /^add_(.+)!$/
name = $1.to_sym
self.assign_property(name, []) unless self.has_key?(name)
unless self[name].is_a?(Array)
raise TypeError, "Cannot #add! to a #{self[name].class}"
end
if args.length > 0
local_args = args.collect { |a| self.class.structurize a }
result = self[name].push *local_args
elsif block_given?
result = HashWithStructAccess.new
self[name].push result
end
elsif args.length == 1
self.assign_property(name, args[0])
result = self[name]
elsif args.length > 1
super(sym,*args,&block)
else
result = self[name]
if result.nil? and block_given?
self.assign_property(name, HashWithStructAccess.new)
result = self[name]
end
end
if block_given?
eval_or_yield result, &block
end
result
end