changed interface to abstract class