https://medium.com/arcanium/liskov-substitution-principle-the-l-in-solid-programming-principles-a69b274d796a