https://medium.com/@neighbour.matthew/understanding-object-oriented-programming-a-comprehensive-guide-a43db764893b