Introducing __reduce_ex__, which is called with a protocol number argument
if it exists in preference over __reduce__.  Now Tim can go implement this
in cPickle.c.
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py
index 6dc52c2..fa4ce72 100644
--- a/Lib/copy_reg.py
+++ b/Lib/copy_reg.py
@@ -109,6 +109,17 @@
         dictitems = obj.iteritems()
     return __newobj__, (cls,) + args, state, listitems, dictitems
 
+# Extended reduce:
+
+def _reduce_ex(obj, proto=0):
+    obj_reduce = getattr(obj, "__reduce__", None)
+    if obj_reduce and obj.__class__.__reduce__ is not object.__reduce__:
+        return obj_reduce()
+    elif proto < 2:
+        return _reduce(obj)
+    else:
+        return _better_reduce(obj)
+
 def _slotnames(cls):
     """Return a list of slot names for a given class.