made into an abstract class