This project demonstrate the adherence to S.O.L.I.D principles introduced by Robert C. Martin in his 2000 paper "Design Principles and Design Patterns"
Gather together the things that change for the same reasons. Separate things that change for different reasons.
A module should be open for extension but closed for modification.
Subclasses should be substitutable for their base classes.
Many client specific interfaces are better than one general purpose interface
Depend upon Abstractions. Do not depend upon concretions.