Changeset 1080
- Timestamp:
- 11/30/03 20:55:12 (5 years ago)
- Files:
-
- trunk/lib/soap/property.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/soap/property.rb
r1079 r1080 13 13 def initialize 14 14 @store = Hash.new 15 @hook = Hash.new 15 16 end 16 17 … … 23 24 # value: an Object 24 25 def []=(name, value) 25 assign(name_to_a(name), value) 26 hooks = assign(name_to_a(name), value) 27 hooks.each do |hook| 28 hook.call(name, value) 29 end 30 value 31 end 32 33 def add_hook(name, &hook) 34 assign_hook(name_to_a(name), &hook) 35 end 36 37 protected 38 39 def referent(ary) 40 key = to_key(ary[0]) 41 if ary.size == 1 42 @store[key] 43 else 44 deref_key(key).referent(ary[1..-1]) 45 end 46 end 47 48 def assign(ary, value) 49 key = to_key(ary[0]) 50 if ary.size == 1 51 @store[key] = value 52 local_hook(key) 53 else 54 local_hook(key) + deref_key(key).assign(ary[1..-1], value) 55 end 56 end 57 58 def assign_hook(ary, &hook) 59 key = to_key(ary[0]) 60 if ary.size == 1 61 (@hook[key] ||= []) << hook 62 else 63 deref_key(key).assign_hook(ary[1..-1], &hook) 64 end 26 65 end 27 66 28 67 private 29 68 30 def referent(ary) 31 if ary.size == 1 32 @store[to_key(ary[0])] ||= self.class.new 33 else 34 name, rest = ary 35 ref = (@store[to_key(name)] ||= self.class.new) 36 ref[rest] ||= self.class.new 37 end 69 def deref_key(key) 70 @store[key] ||= self.class.new 38 71 end 39 72 40 def assign(ary, value) 41 if ary.size == 1 42 @store[to_key(ary[0])] = value 43 else 44 name = ary.pop 45 referent(ary)[name.intern] = value 46 end 73 NO_HOOK = [].freeze 74 def local_hook(key) 75 @hook[key] || NO_HOOK 47 76 end 48 77