[Zope-Checkins] CVS: Zope3/lib/python/Zope/Configuration - meta.py:1.1.2.9.14.1

Steve Alexander steve@cat-box.net
Sat, 1 Jun 2002 04:35:55 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/Configuration
In directory cvs.zope.org:/tmp/cvs-serv4086/lib/python/Zope/Configuration

Modified Files:
      Tag: Zope3InWonderland-branch
	meta.py 
Log Message:
added handler_method attribute to subdirectives to explicitly say
what method of a directive handler class will process them.


=== Zope3/lib/python/Zope/Configuration/meta.py 1.1.2.9 => 1.1.2.9.14.1 ===
     return subdirs
 
-def registersub(directives, name):
+def registersub(directives, name, handler_method=None):
+    if not handler_method:
+        handler_method = name[1]
     subdirs = {}
-    directives[name] = subdirs
+    directives[name] = subdirs, handler_method
     return subdirs
 
 def _exe(callable, subs, context, kw):
@@ -59,15 +61,23 @@
     return _exe(callable, subs, _context, kw)
 
 def sub(subs, _name, _context, **kw):
-
     base, subdirs = subs
-    
     try:
         subs = subdirs[_name]
     except KeyError:
         raise InvalidDirective(_name)
-
-    callable = getattr(base, _name[1])
+        
+    # this is crufty.
+    # if this is a tuple, it means we created it as such in 
+    # registersub, and so we grab item 1 as the handler_method
+    # and rebind subs as item 0
+        
+    if isinstance(subs, tuple):
+        handler_method = subs[1]
+        subs = subs[0]
+    else:
+        handler_method = _name[1]
+    callable = getattr(base, handler_method)
 
     return _exe(callable, subs, _context, kw)
 
@@ -92,14 +102,14 @@
                   namespace=None):
         namespace = namespace or self._namespace
         subs = register((namespace, name), _context.resolve(handler))
-        return Subdirective(subs, namespace)
+        return Subdirective(subs, namespace=namespace)
 
     def __call__(self):
         return ()
 
 def Directive(_context, namespace, name, handler, attributes=''):
     subs = register((namespace, name), _context.resolve(handler))
-    return Subdirective(subs, namespace)
+    return Subdirective(subs, namespace=namespace)
 
 Directive.__implements__ = INonEmptyDirective
 
@@ -120,12 +130,14 @@
         self._subs = subs
         self._namespace = namespace
 
-    def subdirective(self, _context, name, attributes='', namespace=None):
+    def subdirective(self, _context, name, attributes='',
+                     namespace=None, handler_method=None):
         namespace = namespace or self._namespace
         if not namespace:
             raise InvaliDirectiveDefinition(name)
-            
-        subs = registersub(self._subs, (namespace, name))
+        #if not handler_method:
+        #    handler_method = name
+        subs = registersub(self._subs, (namespace, name), handler_method)
         return Subdirective(subs)
 
     def __call__(self):