# Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved. # Author: Nicolas Despres . # License: Gnu General Public License. # $LastChangedBy: polrop $ # $Id: drb_observable.rb 100 2005-01-15 07:45:14Z polrop $ require 'drb/observer' require 'observable' module DRb module DRbObservable include Observable undef notify_observers def notify_observers(*args, &block) if defined? @observer_state and @observer_state if defined? @observer_peers for i in @observer_peers.dup begin i.update(*args, &block) rescue delete_observer(i) end end end @observer_state = false end end def notify_observer(observer, *arg, &block) if defined? @observer_state and @observer_state if defined? @observer_peers if @observer_peers.include?(observer) begin observer.update(*arg, &block) rescue delete_observer(observer) end end end @observer_state = false end end end # module DRbObservable end # module DRb if defined? TEST_MODE or __FILE__ == $0 require 'test/unit/ui/yaml/testrunner' module DRb class ObservablePoolTest < ::Test::Unit::TestCase class Obsv include DRbObservable end class Foo def update(*args, &block) raise 'toto' end end def test_simple o = Obsv.new assert_respond_to(o, :list_observers) o.add_observer(Foo.new) assert_equal(1, o.count_observers) o.changed o.notify_observers('msg') assert_equal(0, o.count_observers) end end # class ObservablePoolTest end # module DRb end