well not strictly true. I think `output` and `copy` always need to be overridden, right? Should we annotate those `abc.abstractmethod` ?