move to abstract class