https://medium.com/@karimpazoki/oriented-programming-oop-concepts-encapsulation-inheritance-polymorphism-abstraction-and-68c71527720c