A filter as an abstract class, letting you provide a filter instead of
an op, automatically providing a good .toString for debugging, and
providing a reasonable "place" inside the inheriting class/object to put
state or helpers or other logic associated with the filter.
the .toString of this object, except by making it separate we force
the implementer to provide something and stop them from accidentally
leaving it as the meaningless default.
the .toString of this object, except by making it separate we force
the implementer to provide something and stop them from accidentally
leaving it as the meaningless default.