Refactored the existing architecture entirely as it just wasn't correct from an OOP stand-point.
The new architecture follows the following layout:

Most other details will be added in the upcoming documentation