Module: Tusk::Observable::DRb
- Defined in:
- lib/tusk/observable/drb.rb
Overview
An observer implementation for DRb. This module requires that you start a DRb server, which can be done via Server.start
This observer works across processes.
Example:
require 'tusk/observable/drb'
class Timer
include Tusk::Observable::DRb
# Start the DRb server. Do this once
Thread.new { Server.start }
def tick
changed
notify_observers
end
end
class Listener
def update
puts "got update"
end
end
timer = Timer.new
fork do
timer.add_observer Listener.new
sleep # put the process to sleep so it doesn't exit
end
loop do
timer.tick
sleep 1
end
Defined Under Namespace
Class Method Summary collapse
Instance Method Summary collapse
-
#add_observer(object, func = :update) ⇒ Object
Add
observeras an observer to this object. -
#changed(state = true) ⇒ Object
Set the changed state of this object.
-
#changed? ⇒ Boolean
Returns true if this object's state has been changed since the last call to #notify_observers.
-
#count_observers ⇒ Object
Returns the number of observers associated with this object in the current process.
-
#delete_observer(o) ⇒ Object
Remove
observerso that it will no longer receive notifications. -
#delete_observers ⇒ Object
Remove all observers associated with this object in the current process.
- #initialize(*args) ⇒ Object
-
#notify_observers(*args) ⇒ Object
If this object's #changed? state is true, this method will notify observing objects.
Class Method Details
.extended(klass) ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/tusk/observable/drb.rb', line 93 def self.extended klass super klass.instance_eval do @bus = DRbObject.new_with_uri uri @observer_state = false @subscribers = {} end end |
Instance Method Details
#add_observer(object, func = :update) ⇒ Object
Add observer as an observer to this object. The object will
receive a notification when #changed? returns true and #notify_observers
is called.
func method is called on object when notifications are sent.
116 117 118 119 120 121 122 123 124 |
# File 'lib/tusk/observable/drb.rb', line 116 def add_observer object, func = :update unless ::DRb.thread && ::DRb.thread.alive? ::DRb.start_service end proxy = Proxy.new object, func @subscribers[object] = proxy @bus.watch channel, proxy end |
#changed(state = true) ⇒ Object
Set the changed state of this object. Notifications will be sent only
if the changed state is a truthy object.
156 157 158 |
# File 'lib/tusk/observable/drb.rb', line 156 def changed state = true @observer_state = state end |
#changed? ⇒ Boolean
Returns true if this object's state has been changed since the last call to #notify_observers.
150 151 152 |
# File 'lib/tusk/observable/drb.rb', line 150 def changed? @observer_state end |
#count_observers ⇒ Object
Returns the number of observers associated with this object in the current process. If the object is observed across multiple processes, the returned count will not reflect the other processes.
163 164 165 |
# File 'lib/tusk/observable/drb.rb', line 163 def count_observers @subscribers.length end |
#delete_observer(o) ⇒ Object
Remove observer so that it will no longer receive notifications.
143 144 145 146 |
# File 'lib/tusk/observable/drb.rb', line 143 def delete_observer o proxy = @subscribers.delete o @bus.delete_observer channel, proxy end |
#delete_observers ⇒ Object
Remove all observers associated with this object in the current process. This method will not impact observers of this object in other processes.
137 138 139 140 |
# File 'lib/tusk/observable/drb.rb', line 137 def delete_observers @bus.delete channel @subscribers.clear end |
#initialize(*args) ⇒ Object
103 104 105 106 107 108 109 |
# File 'lib/tusk/observable/drb.rb', line 103 def initialize *args super @bus = DRbObject.new_with_uri uri @observer_state = false @subscribers = {} end |
#notify_observers(*args) ⇒ Object
If this object's #changed? state is true, this method will notify observing objects.
128 129 130 131 132 |
# File 'lib/tusk/observable/drb.rb', line 128 def notify_observers(*args) return unless changed? @bus.signal channel, args changed false end |