public void resolve(DependencyMetaData dependency, BuildableComponentIdResolveResult result) {
   ModuleVersionSelector module = dependency.getRequested();
   DefaultDependencyResolveDetails details = new DefaultDependencyResolveDetails(module);
   try {
     rule.execute(details);
   } catch (Throwable e) {
     result.failed(new ModuleVersionResolveException(module, e));
     return;
   }
   if (details.isUpdated()) {
     DependencyMetaData substitutedDependency =
         dependency.withRequestedVersion(details.getTarget());
     resolver.resolve(substitutedDependency, result);
     result.setSelectionReason(details.getSelectionReason());
     return;
   }
   resolver.resolve(dependency, result);
 }