refactored abstract class to interface