'Make a (shallow) copy of the set.
There is a \'clone protocol\' that subclasses of this class
should use.  To make a copy, first call your super\'s _clone()
method, and use the object returned as the new instance.  Then
make shallow copies of the attributes defined in the subclass.
This protocol allows us to write the set algorithms that
return new instances (e.g. union) once, and keep using them in
subclasses.'

def _clone(self):

    cls = self.__class__
    obj = cls.__new__(cls)
    obj.items = list(self.items)
    return obj
