moving to abstract classes and interfaces