progress refactoring + abstracting