New game dialog allows selecting engines.
[kaya.git] / lib / observer_utils.rb
blobe426ff80a96f44aeba68cc735410ef27730812f1
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     obs = SimpleObserver.new(event, &blk)
28     add_observer obs
29     # return observer so that we can remove it later
30     obs
31   end
33   def fire(e)
34     changed
35     notify_observers any_to_event(e)
36   end
37   
38   def any_to_event(e)
39     if e.is_a? Symbol
40       { e => nil }
41     else
42       e
43     end
44   end
45 end
47 class SimpleObserver
48   def initialize(event, &blk)
49     @event = event
50     @blk = blk
51   end
52   
53   def update(data)
54     if data.has_key?(@event)
55       case @blk.arity
56       when 0
57         @blk[]
58       when 1
59         @blk[data[@event]]
60       else
61         @blk[*data[@event]]
62       end
63     end
64   end
65 end
67 class Object
68   def metaclass
69     class << self
70       self
71     end
72   end
73   
74   def metaclass_eval(&blk)
75     metaclass.instance_eval(&blk)
76   end
77 end