Using function annotations and abstract base classes