# File lib/raindrops/struct.rb, line 20
  def self.new(*members)
    members = members.map { |x| x.to_sym }.freeze
    str = "def initialize(*values)\n  (MEMBERS.size >= values.size) or raise ArgumentError, \"too many arguments\"\n  @raindrops = Raindrops.new(MEMBERS.size)\n  values.each_with_index { |val,i| @raindrops[i] = values[i] }\nend\n\ndef initialize_copy(src)\n  @raindrops = src.instance_variable_get(:@raindrops).dup\nend\n\ndef []=(index, value)\n  @raindrops[index] = value\nend\n\ndef [](index)\n  @raindrops[index]\nend\n\ndef to_hash\n  ary = @raindrops.to_ary\n  rv = {}\n  MEMBERS.each_with_index { |member, i| rv[member] = ary[i] }\n  rv\nend\n"

    members.each_with_index do |member, i|
      str << "def incr_#{member}; @raindrops.incr(#{i}); end; " \
             "def decr_#{member}; @raindrops.decr(#{i}); end; " \
             "def #{member}; @raindrops[#{i}]; end; " \
             "def #{member}=(val); @raindrops[#{i}] = val; end; "
    end

    klass = Class.new
    klass.const_set(:MEMBERS, members)
    klass.class_eval(str)
    klass
  end