refactoring interfaces and using abstract classes because sexy