123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
class Object def takeValueForKey(value, key) send("#{key}=", value) end def valueForKey(key) send(key) end def takeValueForKeyPath(value, keyPath) keys = keyPath.split('.') lastKey = keys.pop target = self for key in keys target = target.valueForKey(key) end target.takeValueForKey(value, lastKey) end def valueForKeyPath(keyPath) keys = keyPath.split('.') result = self keys.each_index do |i| if keys[i] =~ /^[&](.*)/ return result.send($1) {|val| val.valueForKeyPath(keys[i+1..-1].join('.')) } end result = result.valueForKey keys[i] end result end end class Hash def takeValueForKey(value, key) self[key] = value end def valueForKey(key) self[key] end end class Array def takeValueForKey(value, key) self[key.to_i] = value end def valueForKey(key) self[key.to_i] end end