Add licence and installation instructions.
[kaya.git] / lib / observer_utils.rb
blob80e5b73195a5073b685fa52fdd913aea261c8770
1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 require 'observer'
10 module Observer
11   def update(data)
12     data.each_key do |key|
13       m = begin
14         method("on_#{key}")
15       rescue NameError
16       end
17       
18       if m
19         case m.arity
20         when 0
21           m[]
22         when 1
23           m[data[key]]
24         else
25           m[*data[key]]
26         end
27       end
28     end
29   end
30 end
32 module Observable
33   def observe(event, &blk)
34     obs = SimpleObserver.new(event, &blk)
35     add_observer obs
36     # return observer so that we can remove it later
37     obs
38   end
40   def fire(e)
41     changed
42     notify_observers any_to_event(e)
43   end
44   
45   def any_to_event(e)
46     if e.is_a? Symbol
47       { e => nil }
48     else
49       e
50     end
51   end
52 end
54 class SimpleObserver
55   def initialize(event, &blk)
56     @event = event
57     @blk = blk
58   end
59   
60   def update(data)
61     if data.has_key?(@event)
62       case @blk.arity
63       when 0
64         @blk[]
65       when 1
66         @blk[data[@event]]
67       else
68         @blk[*data[@event]]
69       end
70     end
71   end
72 end
74 class Object
75   def metaclass
76     class << self
77       self
78     end
79   end
80   
81   def metaclass_eval(&blk)
82     metaclass.instance_eval(&blk)
83   end
84 end