# File lib/facet/superstruct.rb, line 184
  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  # ?-methods are not created automatically
        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                 # getter
            define_method(getter) do
              instance_variable_get(ivar)
            end
          end
        else
          klass.class_eval do                 # setter
            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