summaryrefslogtreecommitdiffstats
path: root/lib/observer.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-05 08:29:52 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-05 08:29:52 +0000
commit28f806a119f0c3acaf4b91b8b652b324282b450d (patch)
treedf86f2bf64022459acef5eea33442fb3d3ebcc27 /lib/observer.rb
parente6e884c05e2f8a67a1d3d04e869fe3888e223b18 (diff)
downloadruby-28f806a119f0c3acaf4b91b8b652b324282b450d.tar.gz
ruby-28f806a119f0c3acaf4b91b8b652b324282b450d.tar.xz
ruby-28f806a119f0c3acaf4b91b8b652b324282b450d.zip
* lib/ostruct.rb: a patch from Florian Gross <florgro@gmail.com>
merged to allow recursive inspect (and to_s) for OpenStruct. [ruby-core:05532] * lib/observer.rb: a patch from nornagon <nornagon@gmail.com> merged to allow arbitrary names for update methods. [ruby-core:05416] * eval.c (rb_f_fcall): new method to avoid inefficiency of obj.instance_eval{send(...)} tricks. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@9081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/observer.rb')
-rw-r--r--lib/observer.rb19
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/observer.rb b/lib/observer.rb
index 64c7d8135..472a15439 100644
--- a/lib/observer.rb
+++ b/lib/observer.rb
@@ -118,14 +118,15 @@ module Observable
#
# Add +observer+ as an observer on this object. +observer+ will now receive
- # notifications.
+ # notifications. The second optional argument specifies a method to notify
+ # updates, of which default value is +update+.
#
- def add_observer(observer)
- @observer_peers = [] unless defined? @observer_peers
- unless observer.respond_to? :update
- raise NoMethodError, "observer needs to respond to `update'"
+ def add_observer(observer, func=:update)
+ @observer_peers = {} unless defined? @observer_peers
+ unless observer.respond_to? func
+ raise NoMethodError, "observer does not respond to `#{func.to_s}'"
end
- @observer_peers.push observer
+ @observer_peers[observer] = func
end
#
@@ -181,9 +182,9 @@ module Observable
def notify_observers(*arg)
if defined? @observer_state and @observer_state
if defined? @observer_peers
- for i in @observer_peers.dup
- i.update(*arg)
- end
+ @observer_peers.each { |k, v|
+ k.send v, *arg
+ }
end
@observer_state = false
end