Since `Plan` is abstract, I think you might have to parametrize by the type of the plan itself to get type inference?