https://medium.com/@rprzetakowski/understanding-object-oriented-programming-a-comprehensive-guide-b22ba79b16d3