Fix navigation and highlighting.
[kaya.git] / lib / observer_utils.rb
bloba7880559e2f0b3548b8ae5805ab04c4a2477207d
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   include Observer
46   
47   def initialize(event, &blk)
48     metaclass_eval do
49       define_method "on_#{event}", &blk
50     end
51   end
52 end
54 class Object
55   def metaclass
56     class << self
57       self
58     end
59   end
60   
61   def metaclass_eval(&blk)
62     metaclass.instance_eval(&blk)
63   end
64 end