https://medium.com/arcanium/interface-segregation-principle-the-i-in-solid-programming-principles-9ce13e8c283f