finished implementing assignment requirements and unit tests
cleaned up and refactored to make classes short and focused