Created more interfaces and abstractions to reduce the overall amount of code to write