Factored out abstract base class