implemented abstract base class