Module | Observable |
In: |
observer.rb
|
Implements the Observable design pattern as a mixin so that other objects can be notified of changes in state. See observer.rb for details and an example.
Add observer as an observer on this object. observer will now receive notifications.
# File observer.rb, line 123 def add_observer(observer) @observer_peers = [] unless defined? @observer_peers unless observer.respond_to? :update raise NoMethodError, "observer needs to respond to `update'" end @observer_peers.push observer end
Set the changed state of this object. Notifications will be sent only if the changed state is true.
# File observer.rb, line 161 def changed(state=true) @observer_state = state end
Query the changed state of this object.
# File observer.rb, line 168 def changed? if defined? @observer_state and @observer_state true else false end end
Return the number of observers associated with this object.
# File observer.rb, line 149 def count_observers if defined? @observer_peers @observer_peers.size else 0 end end
Delete observer as an observer on this object. It will no longer receive notifications.
# File observer.rb, line 135 def delete_observer(observer) @observer_peers.delete observer if defined? @observer_peers end
Delete all observers associated with this object.
# File observer.rb, line 142 def delete_observers @observer_peers.clear if defined? @observer_peers end
If this object’s changed state is true, invoke the update method in each currently associated observer in turn, passing it the given arguments. The changed state is then set to false.
# File observer.rb, line 181 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 end @observer_state = false end end