Refactored much of the project into distinct objects