Be sure to implement this method when sub-classing, otherwise you
        will lose any specialization context.

def copy(self):
        """Be sure to implement this method when sub-classing, otherwise you
        will lose any specialization context."""
        doppel = type(self)(
            self.unpack, self.apply, self.collect, self.reduce,
            apply_empty_slots=self.apply_empty_slots,
            extraneous=self.extraneous,
            ignore_empty_string=self.ignore_empty_string,
            ignore_none=self.ignore_none,
            visit_filter=self.visit_filter,
        )
        for x in self.cue:
            doppel.push(x)
        doppel.seen = self.seen
        return doppel