https://medium.com/@thebinarybanter/oop-vs-functional-vs-meta-programming-whats-the-difference-3fb5e0296b8b