# HG changeset patch
# User Florent Hivert <Florent.Hivert@univ-rouen.fr>
# Date 1257704816 -3600
# Node ID 8964c91cf153cb59c7a1f38d27f44233e8b3d099
# Parent  d254fc7a1df169a8235b123a3bc1cdec70a5d788
Copy called on an ElementWrapper does now copy the wrapped value.

diff --git a/sage/structure/element_wrapper.py b/sage/structure/element_wrapper.py
--- a/sage/structure/element_wrapper.py
+++ b/sage/structure/element_wrapper.py
@@ -3,6 +3,7 @@ A class for wrapping Sage or Python obje
 """
 
 from sage.structure.element import Element
+from copy import copy
 
 class ElementWrapper(Element):
     r"""
@@ -154,3 +155,90 @@ class ElementWrapper(Element):
         if self.parent() != other.parent():
             return cmp(self.parent(), other.parent())
         return cmp(self.value, other.value)
+
+    def __copy__(self):
+        """
+        Copy self and in particular its ``value`` attribute.
+
+        EXAMPLES::
+
+            sage: o1 = ElementWrapper([1], parent=ZZ); o1
+            [1]
+            sage: o2 = copy(o1); o2
+            [1]
+            sage: o2.value[0] = 3; o2
+            [3]
+            sage: o1
+            [1]
+            sage: class bla(ElementWrapper): pass
+            sage: o3 = bla([1], parent=ZZ)
+            sage: o4 = copy(o3)
+            sage: o3.value[0] = 3; o4
+            [1]
+            sage: o3.__class__
+            <class '__main__.bla'>
+            sage: o4.__class__
+            <class '__main__.bla'>
+        """
+        cls = self.__class__
+        res = cls.__new__(cls)
+        Element.__init__(res, parent = self.parent())
+        res.__dict__ = copy(self.__dict__)
+        res.value = copy(res.value)
+        return res
+
+
+from sage.rings.integer_ring import ZZ
+class ElementWrapperTester(ElementWrapper):
+    """
+    The goal of this class is to test that if you inherits from ElementWrapper
+    to add some more attribute, copy still works as expected.
+
+    TESTS::
+
+        sage: from sage.structure.element_wrapper import ElementWrapperTester
+        sage: x = ElementWrapperTester()
+        sage: x.append(2); y = copy(x); y.append(42)
+        sage: x, y
+        ([n=1, value=[2]], [n=2, value=[2, 42]])
+        sage: x.append(21); x.append(7)
+        sage: x, y
+        ([n=3, value=[2, 21, 7]], [n=2, value=[2, 42]])
+        sage: x.__dict__, y.__dict__
+        ({'value': [2, 21, 7], 'n': 3}, {'value': [2, 42], 'n': 2})
+    """
+    def __init__(self):
+        """
+        TESTS::
+
+            sage: from sage.structure.element_wrapper import ElementWrapperTester
+            sage: x = ElementWrapperTester(); x
+            [n=0, value=[]]
+        """
+        super(ElementWrapperTester, self).__init__([], parent = ZZ)
+        self.n = 0
+
+    def append(self, x):
+        """
+        TESTS::
+
+            sage: from sage.structure.element_wrapper import ElementWrapperTester
+            sage: x = ElementWrapperTester()
+            sage: x.append(2); x
+            [n=1, value=[2]]
+        """
+        self.n +=1
+        self.value.append(x)
+
+    def __repr__(self):
+        """
+        TESTS::
+
+            sage: from sage.structure.element_wrapper import ElementWrapperTester
+            sage: x = ElementWrapperTester
+            sage: x = ElementWrapperTester(); x
+            [n=0, value=[]]
+            sage: x.value = [2,32]; x
+            [n=0, value=[2, 32]]
+        """
+        return "[n=%s, value=%s]"%(self.n, self.value)
