Use __reduce_ex__ in copy.py.  The test_*copy_cant() tests are simpler again.
diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py
index 6a31f75..cde545d 100644
--- a/Lib/test/test_copy.py
+++ b/Lib/test/test_copy.py
@@ -46,6 +46,16 @@
         copy_reg.pickle(C, pickle_C, C)
         y = copy.copy(x)
 
+    def test_copy_reduce_ex(self):
+        class C(object):
+            def __reduce_ex__(self, proto):
+                return ""
+            def __reduce__(self):
+                raise test_support.TestFailed, "shouldn't call this"
+        x = C()
+        y = copy.copy(x)
+        self.assert_(y is x)
+
     def test_copy_reduce(self):
         class C(object):
             def __reduce__(self):
@@ -55,13 +65,11 @@
         self.assert_(y is x)
 
     def test_copy_cant(self):
-        class Meta(type):
+        class C(object):
             def __getattribute__(self, name):
-                if name == "__reduce__":
+                if name.startswith("__reduce"):
                     raise AttributeError, name
                 return object.__getattribute__(self, name)
-        class C:
-            __metaclass__ = Meta
         x = C()
         self.assertRaises(copy.Error, copy.copy, x)
 
@@ -209,6 +217,16 @@
         copy_reg.pickle(C, pickle_C, C)
         y = copy.deepcopy(x)
 
+    def test_deepcopy_reduce_ex(self):
+        class C(object):
+            def __reduce_ex__(self, proto):
+                return ""
+            def __reduce__(self):
+                raise test_support.TestFailed, "shouldn't call this"
+        x = C()
+        y = copy.deepcopy(x)
+        self.assert_(y is x)
+
     def test_deepcopy_reduce(self):
         class C(object):
             def __reduce__(self):
@@ -218,13 +236,11 @@
         self.assert_(y is x)
 
     def test_deepcopy_cant(self):
-        class Meta(type):
+        class C(object):
             def __getattribute__(self, name):
-                if name == "__reduce__":
+                if name.startswith("__reduce"):
                     raise AttributeError, name
                 return object.__getattribute__(self, name)
-        class C:
-            __metaclass__ = Meta
         x = C()
         self.assertRaises(copy.Error, copy.deepcopy, x)