finished refactoring expression abstraction