#! /usr/bin/python

from twisted.internet import reactor
from foolscap.api import Copyable, Referenceable, Tub

# the sending side defines the Copyable

class UserRecord(Copyable):
    # this class uses the default Copyable behavior
    typeToCopy = "unique-string-UserRecord"

    def __init__(self, name, age, shoe_size):
        self.name = name
        self.age = age
        self.shoe_size = shoe_size # this is a secret

    def getStateToCopy(self):
        d = {}
        d['name'] = self.name
        d['age'] = self.age
        # don't tell anyone our shoe size
        return d

class Database(Referenceable):
    def __init__(self):
        self.users = {}
    def addUser(self, name, age, shoe_size):
        self.users[name] = UserRecord(name, age, shoe_size)
    def remote_getuser(self, name):
        return self.users[name]

db = Database()
db.addUser("alice", 34, 8)
db.addUser("bob", 25, 9)

tub = Tub()
tub.listenOn("tcp:12345")
tub.setLocation("localhost:12345")
url = tub.registerReference(db, "database")
print "the database is at:", url
tub.startService()
reactor.run()
