[Zope3-checkins] CVS: Zope3/src/zope/component - service.py:1.6

Jim Fulton cvs-admin at zope.org
Fri Nov 21 12:09:59 EST 2003


Update of /cvs-repository/Zope3/src/zope/component
In directory cvs.zope.org:/tmp/cvs-serv29575/src/zope/component

Modified Files:
	service.py 
Log Message:
Made global service managers picklable as global objects.

Added GlobalService base class for creating pickleable global
services. Global services are pickled by reducing them to (now
picklable) global service managers and service named.


=== Zope3/src/zope/component/service.py 1.5 => 1.6 ===
--- Zope3/src/zope/component/service.py:1.5	Mon Oct  6 18:08:54 2003
+++ Zope3/src/zope/component/service.py	Fri Nov 21 12:09:29 2003
@@ -50,15 +50,24 @@
        the required interface
     """
 
-class GlobalServiceManager:
+class GlobalServiceManager(object):
     """service manager"""
 
     implements(IGlobalServiceManager)
 
-    def __init__(self):
+    def __init__(self, name=None, module=None):
+        self._clear()
+        self.__name__ = name
+        self.__module__ = module
+
+    def _clear(self):
         self.__defs     = {}
         self.__services = {}
 
+    def __reduce__(self):
+        # Global service managers are pickled as global objects
+        return self.__name__
+
     def defineService(self, name, interface):
         """see IGlobalServiceManager interface"""
 
@@ -87,6 +96,10 @@
         if not self.__defs[name].isImplementedBy(component):
             raise InvalidService(name, component, self.__defs[name])
 
+        if isinstance(component, GlobalService):
+            component.__parent__ = self
+            component.__name__ = name
+
         self.__services[name] = component
 
     def getService(self, name):
@@ -102,16 +115,23 @@
 
         return self.__services.get(name, default)
 
-    _clear = __init__
 
+def GS(service_manager, service_name):
+    return service_manager.getService(service_name)
 
-serviceManager = GlobalServiceManager() # the global service manager instance
-defineService = serviceManager.defineService
+class GlobalService(object):
 
+    def __reduce__(self):
+        return GS, (self.__parent__, self.__name__)
 
-_clear         = serviceManager._clear
+
+
+# the global service manager instance
+serviceManager = GlobalServiceManager('serviceManager', __name__)
+
+defineService = serviceManager.defineService
 
 # Register our cleanup with Testing.CleanUp to make writing unit tests simpler.
 from zope.testing.cleanup import addCleanUp
-addCleanUp(_clear)
+addCleanUp(serviceManager._clear)
 del addCleanUp




More information about the Zope3-Checkins mailing list