def SuperStruct.open(*args)
klass = SuperStruct.new(*args)
table = @table
setsyms = @setsyms
table = @table
klass.class_eval do
define_method(:method_missing) do |meth, *args|
mname = meth.id2name
if mname =~ /=$/
getter = mname.chop
setter = mname
elsif mname =~ /\?$/
raise NoMethodError
else
getter = mname
setter = mname + "="
end
gsym = getter.intern
ssym = setter.intern
ivar = "@" + getter
setsyms << setter
table << getter
len = args.length
if mname == getter
klass.class_eval do
define_method(getter) do
instance_variable_get(ivar)
end
end
else
klass.class_eval do
define_method(setter) do |*args|
if len != 1
raise ArgumentError, "Wrong # of arguments (#{len} for 1)",
caller(1)
end
instance_variable_set(ivar,args[0])
instance_variable_get(ivar)
end
end
end
if mname == setter
self.send(setter,*args)
else
if len == 0
self.send(getter)
else
raise NoMethodError, "Undefined method '#{mname}' for #{self}",
caller(1)
end
end
end
end
klass
end