public static TargetResolutionLogger of(
     final ComputationTargetResolver.AtVersionCorrection underlying,
     final ConcurrentMap<ComputationTargetReference, UniqueId> resolutions) {
   return new TargetResolutionLogger(
       underlying,
       new LoggingSpecificationResolver(underlying.getSpecificationResolver(), resolutions));
 }
 /**
  * If the specification is lazily resolvable, returns a target that will resolve it on demand.
  * Otherwise it is resolved immediately.
  *
  * @param underlying the underlying resolver to use for resolution
  * @param specification the specification to resolve
  * @return the target
  */
 public static ComputationTarget resolve(
     final ComputationTargetResolver.AtVersionCorrection underlying,
     final ComputationTargetSpecification specification) {
   final Function2<
           ComputationTargetResolver.AtVersionCorrection,
           ComputationTargetSpecification,
           UniqueIdentifiable>
       resolver = s_resolvers.get(specification.getType());
   if (resolver != null) {
     return new ComputationTarget(specification, resolver.execute(underlying, specification));
   } else {
     return underlying.resolve(specification);
   }
 }
 @Override
 public VersionCorrection getVersionCorrection() {
   return _underlying.getVersionCorrection();
 }
 @Override
 public ComputationTargetType simplifyType(final ComputationTargetType type) {
   return _underlying.simplifyType(type);
 }
 @Override
 public ComputationTarget resolve(final ComputationTargetSpecification specification) {
   return _underlying.resolve(specification);
 }