Moving Protocol implementation to abstract base classes