https://medium.com/@jordantkay/understanding-abstract-classes-a-blueprint-for-building-flexible-code-59b1cd5477a3