Index: src/peak/config/config_components.py =================================================================== --- src/peak/config/config_components.py (revision 2778) +++ src/peak/config/config_components.py (working copy) @@ -764,8 +764,8 @@ def noMoreValues(self,root,configKey,forObj): pass - def nameNotFound(self,root,name,forObj): - return naming.lookup(forObj, name, creationParent=forObj) + def nameNotFound(self,root,name,forObj,default=NOT_GIVEN): + return naming.lookup(forObj, name, creationParent=forObj, default=default) Index: src/peak/config/interfaces.py =================================================================== --- src/peak/config/interfaces.py (revision 2778) +++ src/peak/config/interfaces.py (working copy) @@ -134,7 +134,7 @@ def noMoreValues(root,configKey,forObj): """A value search has completed""" - def nameNotFound(root,name,forObj,bindName): + def nameNotFound(root,name,forObj,bindName,default=NOT_GIVEN): """A (non-URL) component name was not found""" Index: src/peak/binding/components.py =================================================================== --- src/peak/binding/components.py (revision 2778) +++ src/peak/binding/components.py (working copy) @@ -285,7 +285,7 @@ -def acquireComponent(component, name): +def acquireComponent(component, name, default=NOT_GIVEN): """Acquire 'name' relative to 'component', w/fallback to naming.lookup() @@ -312,7 +312,7 @@ return adapt( prev, IConfigurationRoot, NullConfigRoot ).nameNotFound( - prev, name, component + prev, name, component, default=default ) @@ -376,38 +376,38 @@ attr = parts.next() # first part pc = _getFirstPathComponent(attr) + if pc: + ob = pc(component) + elif default is NOT_GIVEN: + ob = acquireComponent(component, attr) # let the error happen + else: + ob = acquireComponent(component, attr, NOT_FOUND) - if pc: ob = pc(component) - else: ob = acquireComponent(component, attr) - resolved = [] append = resolved.append try: for attr in parts: + if ob is NOT_FOUND: break pc = _getNextPathComponent(attr) if pc: ob = pc(ob) else: ob = getattr(ob,attr) append(attr) + else: + return ob except AttributeError: + pass - if default is not NOT_GIVEN: - return default + if default is not NOT_GIVEN: + return default - raise exceptions.NameNotFound( - resolvedName = ComponentName(resolved), - remainingName = ComponentName([attr] + [a for a in parts]), - resolvedObj = ob - ) + raise exceptions.NameNotFound( + resolvedName = ComponentName(resolved), + remainingName = ComponentName([attr] + [a for a in parts]), + resolvedObj = ob + ) - return ob - - - - - - _getFirstPathComponent = dict( ( ('', getRootComponent), ('.', lambda x:x),