https://medium.com/@borlidoadrian/protocol-oriented-programming-in-swift-why-you-should-embrace-pop-6cd0ed154fb9