Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1080

Show
Ignore:
Timestamp:
11/30/03 20:55:12 (5 years ago)
Author:
nahi
Message:

* add hook. not tested..

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/property.rb

    r1079 r1080  
    1313  def initialize 
    1414    @store = Hash.new 
     15    @hook = Hash.new 
    1516  end 
    1617 
     
    2324  # value: an Object 
    2425  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 
     37protected 
     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 
    2665  end 
    2766 
    2867private 
    2968 
    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 
    3871  end 
    3972 
    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 
    4776  end 
    4877