diff options
| author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-05 08:29:52 +0000 |
|---|---|---|
| committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-05 08:29:52 +0000 |
| commit | 28f806a119f0c3acaf4b91b8b652b324282b450d (patch) | |
| tree | df86f2bf64022459acef5eea33442fb3d3ebcc27 /lib/observer.rb | |
| parent | e6e884c05e2f8a67a1d3d04e869fe3888e223b18 (diff) | |
| download | ruby-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.rb | 19 |
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 |
