CodeBlock invocation(TypeMirror parameterType, Supplier<CodeBlock> methodBody) {
        Equivalence.Wrapper<TypeMirror> key = MoreTypes.equivalence().wrap(parameterType);
        // This doesn't use putIfAbsent because the methodBody supplier could recursively create
        // new delegate methods. Map.putIfAbsent doesn't support reentrant calls.
        if (!delegateMethods.containsKey(key)) {
          delegateMethods.put(
              key,
              createMethod(
                  methodName.orElseGet(() -> newDelegateMethodName(parameterType)),
                  parameterType,
                  methodBody));
        }
        return CodeBlock.of(
            "$N($L, $L)", delegateMethods.get(key).name, propertyAccess, indentAccess);
      }
Parameter object to simplify the branches of {@link #format(CodeBlock, CodeBlock,
TypeMirror)} that call a delegate method.
value/src/main/java/com/google/auto/value/extension/toprettystring/processor/ToPrettyStringExtension.java