separate abstract class