[Zope-Checkins] CVS: Zope3/lib/python/Zope/ContextWrapper - ContainmentIterator.py:1.1.2.5 SimpleMethodWrapper.py:1.1.2.3 __init__.py:1.1.2.5

Steve Alexander steve@cat-box.net
Tue, 28 May 2002 16:28:44 -0400


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

Modified Files:
      Tag: Zope-3x-branch
	ContainmentIterator.py SimpleMethodWrapper.py __init__.py 
Log Message:
Made ContextWrappers handle the __call__ slot for ContextMethods.

Removed comparisons of objects with Wrapper using isinstance, as this
will fail to work with Python 2.3, when isinstance will respect __class__.

Added wrapperTypes field to the Zope.ContextWrapper module. Now, the
factory for creating ContextWrappers and the types of context wrappers
you might find are handled by different members of Zope.ContextWrapper
module.

This is needed for comparing using type(ob) in wrapperTypes, rather than
isinstance.



=== Zope3/lib/python/Zope/ContextWrapper/ContainmentIterator.py 1.1.2.4 => 1.1.2.5 ===
 """
 
-from Zope.ContextWrapper import Wrapper, getinnercontext
+from Zope.ContextWrapper import Wrapper, wrapperTypes, getinnercontext
 
 class ContainmentIterator:
 
@@ -28,7 +28,7 @@
     
     def next(self):
         ob = self._ob
-        if not isinstance(ob, Wrapper):
+        if type(ob) not in wrapperTypes:
             raise StopIteration
 
         ob = getinnercontext(ob)


=== Zope3/lib/python/Zope/ContextWrapper/SimpleMethodWrapper.py 1.1.2.2 => 1.1.2.3 ===
 # This method wrapper does not work for builtin methods.
 
-from Zope.ContextWrapper import Wrapper
+from Zope.ContextWrapper.wrapper import Wrapper
 
 class ContextMethod(object):
     def __new__(cls, method):
@@ -25,6 +25,16 @@
                 "Cannot make %s into a contextmethod" % type(method)
         return method
 
+
+def wrapperCreator(object, context=None, **data):
+    if hasattr(object, '__call__'):
+        attrdict = getattr(object.__call__, '__dict__', {})
+        if attrdict.get('Zope.ContextWrapper.contextful'):
+            return SimpleCallableMethodWrapper(object, context, **data)
+
+    return SimpleMethodWrapper(object, context, **data)
+
+
 class SimpleMethodWrapper(Wrapper):
 
     def __getattribute__(self, name, empty_dict={}):
@@ -33,4 +43,10 @@
         if attrdict.get('Zope.ContextWrapper.contextful'):
             attr = attr.__get__(self)
         return attr
+        
+        
+class SimpleCallableMethodWrapper(SimpleMethodWrapper):
 
+    def __call__(self, *args, **kw):
+        attr = Wrapper.__getattribute__(self, '__call__')
+        return attr.__get__(self)(*args, **kw)


=== Zope3/lib/python/Zope/ContextWrapper/__init__.py 1.1.2.4 => 1.1.2.5 ===
 # method's __dict__, as the current ContextMethod does.
 # 
-from SimpleMethodWrapper import SimpleMethodWrapper as Wrapper
+from SimpleMethodWrapper import wrapperCreator as Wrapper
 from SimpleMethodWrapper import ContextMethod
+
+from SimpleMethodWrapper import SimpleMethodWrapper,SimpleCallableMethodWrapper
+wrapperTypes = (SimpleMethodWrapper, SimpleCallableMethodWrapper)
+del SimpleMethodWrapper, SimpleCallableMethodWrapper