changed to an abstract class