[Zope3-checkins] CVS: Zope3/src/zope/interface - _flatten.py:1.5

Jim Fulton jim@zope.com
Sat, 3 May 2003 12:35:30 -0400


Update of /cvs-repository/Zope3/src/zope/interface
In directory cvs.zope.org:/tmp/cvs-serv24151/src/zope/interface

Modified Files:
	_flatten.py 
Log Message:
Updated the old _flatten module to use the new declaration machinery.
We really should get rid of this though.



=== Zope3/src/zope/interface/_flatten.py 1.4 => 1.5 ===
--- Zope3/src/zope/interface/_flatten.py:1.4	Thu May  1 15:35:44 2003
+++ Zope3/src/zope/interface/_flatten.py	Sat May  3 12:35:29 2003
@@ -19,40 +19,21 @@
 """
 __metaclass__ = type # All classes are new style when run with Python 2.2+
 
-def _flatten(implements, include_None=0):
-    """Flatten an implements spec to a list of interfaces
-
-    The list includes all base interfaces of the interface(s) in
-    implements. Each interface is listed only once and more
-    specific interfaces are listed before less specific
-    interfaces. This is similar to Python 2.2's MRO.
-    """
-    interfaces = []
-    _flatten_recurse(implements, interfaces)
-    interfaces.reverse()
-    seen = {}
-    flattened = []
-    for interface in interfaces:
-        if interface not in seen:
-            seen[interface] = 1
-            flattened.append(interface)
-    flattened.reverse()
+from zope.interface import Interface, InterfaceSpecification
 
-    if include_None and None not in flattened:
-        flattened.append(None)
+def _flatten(implements, include_None=0):
 
-    return flattened
+    try:
+        r = implements.flattened()
+    except AttributeError:
+        if implements is None:
+            r=()
+        else:
+            r = InterfaceSpecification(implements).flattened()
 
-def _flatten_recurse(implements, list):
-    if implements.__class__ == tuple:
-        for i in implements:
-            _flatten_recurse(i, list)
-    else:
-        _flatten_recurse_interface(implements, list)
+    if not include_None:
+        return r
 
-def _flatten_recurse_interface(interface, list):
-    list.append(interface)
-    if interface is None:
-        return
-    for i in interface.__bases__:
-        _flatten_recurse_interface(i, list)
+    r = list(r)
+    r.append(None)
+    return r