Use normal binding for SimpleObserver.
[kaya.git] / lib / observer_utils.rb
blob269269a045fc591b6d95c4afd6bd0a2b7fb1ac1d
1 require 'observer'
3 module Observer
4   def update(data)
5     data.each_key do |key|
6       m = begin
7         method("on_#{key}")
8       rescue NameError
9       end
10       
11       if m
12         case m.arity
13         when 0
14           m[]
15         when 1
16           m[data[key]]
17         else
18           m[*data[key]]
19         end
20       end
21     end
22   end
23 end
25 module Observable
26   def observe(event, &blk)
27     add_observer SimpleObserver.new(event, &blk)
28   end
30   def fire(e)
31     changed
32     notify_observers any_to_event(e)
33   end
34   
35   def any_to_event(e)
36     if e.is_a? Symbol
37       { e => nil }
38     else
39       e
40     end
41   end
42 end
44 class SimpleObserver
45   def initialize(event, &blk)
46     @event = event
47     @blk = blk
48   end
49   
50   def update(data)
51     if data.has_key?(@event)
52       case @blk.arity
53       when 0
54         @blk[]
55       when 1
56         @blk[data[@event]]
57       else
58         @blk[*data[@event]]
59       end
60     end
61   end
62 end
64 class Object
65   def metaclass
66     class << self
67       self
68     end
69   end
70   
71   def metaclass_eval(&blk)
72     metaclass.instance_eval(&blk)
73   end
74 end