initial
[raindrops.git] / lib / raindrops / struct.rb
blobca5404d9311f2c1d626df599bac247c1225a8122
1 # -*- encoding: binary -*-
3 class Raindrops::Struct
5   def self.new(*members)
6     members = members.map { |x| x.to_sym }.freeze
7     str = <<EOS
8 def initialize(*values)
9   (MEMBERS.size >= values.size) or raise ArgumentError, "too many arguments"
10   @raindrops = Raindrops.new(MEMBERS.size)
11   values.each_with_index { |val,i| @raindrops[i] = values[i] }
12 end
14 def initialize_copy(src)
15   @raindrops = src.instance_variable_get(:@raindrops).dup
16 end
18 def []=(index, value)
19   @raindrops[index] = value
20 end
22 def [](index)
23   @raindrops[index]
24 end
26 def to_hash
27   ary = @raindrops.to_ary
28   rv = {}
29   MEMBERS.each_with_index { |member, i| rv[member] = ary[i] }
30   rv
31 end
32 EOS
34     members.each_with_index do |member, i|
35       str << "def incr_#{member}; @raindrops.incr(#{i}); end; " \
36              "def decr_#{member}; @raindrops.decr(#{i}); end; " \
37              "def #{member}; @raindrops[#{i}]; end; " \
38              "def #{member}=(val); @raindrops[#{i}] = val; end; "
39     end
41     klass = Class.new
42     klass.const_set(:MEMBERS, members)
43     klass.class_eval(str)
44     klass
45   end
47 end