refactoring, observer