refactoring, interface extracted