cleaned up abstract class