https://mysteryweevil.medium.com/mastering-polymorphism-the-secret-to-writing-flexible-and-reusable-python-code-c601c3acb5b3