added an abstract class for functionality increase