https://www.karlancer.com/blog/object-oriented-programming-oop/