more structure and passing tests
implementing abstraction
restructure