While we are making BC breaks to this we should probably figure this out once and for all so its nice and customizable.

The strategy pattern sounds good since getCandidates is somewhat of an algorithm but that still leaves prefix related code throughout the route provider and then also pushes it into the candidate strategy class. What I was thinking it would be good to minimize is the exposure to the concept of "prefixes" throughout the system. I think it may be preferable to have all the prefix related logic in RouteProvider or move it to one class dedicated to knowing how to handle prefixes for routes so that it can be removed from routeprovider so I guess I'm not sure I think having a getCandidates strategy would address this issue and it may actually widen the scope of the code that would have to be changed if your prefix implementation is different.