import Pyro.core
import Pyro.util
import Pyro.naming
from RemoteObject import *

# A Subject is an object that keeps track of the Observers
# watching it.  When the state of a subject changes, it
# notifies each Observer on the list.
class Subject(RemoteObject):
    def __init__(self, name):
        RemoteObject.__init__(self, name)
        self.observers = []

    def register(self, uri):
    # register a new Observer
        observer = Pyro.core.getProxyForURI(uri)
        self.observers.append(observer)

    def notify_observers(self):
    # notify all registered observers when the state of the subject changes
        for observer in self.observers:
            print 'Notifying', observer
            try:
                observer.notify()
            except:
                pass

class SimpleSubject(Subject):
    def __init__(self, name, state=0):
        Subject.__init__(self, name)
        self.state = 0
        
    def set_state(self, state):
    # change the state of the Subject
        print 'New state', state
        self.state = state
        Thread(target=self.notify_observers).start()

    def get_state(self):
    # get the current state of the Subject
        return self.state

def main(script, name='bob', *args):
    SimpleSubject(name).requestLoop()
    
if __name__ == '__main__':
    main(*sys.argv)
