code: @SuppressWarnings("unchecked")
    public <C extends T> C build() {
      if(p == null) {
        throw new AbortException("build() may be called only once.");
      }
      final T obj = ClassGenericsUtil.parameterizeOrAbort(clazz, p);
      if(p.hasUnusedParameters()) {
        LOG.warning("Unused parameters: " + p.getRemainingParameters());
      }
      p = null; // Prevent build() from being called again.
      return (C) obj;
    }
docs: Instantiate, consuming the parameter list.
  
  This will throw an {@link AbortException} if the parameters are incomplete,
  or {@code build()} is called twice.
  
  We lose some type safety here, for convenience. The type {@code <C>} is
  meant to be {@code <T>} with generics added only, which is necessary
  because generics are implemented by erasure in Java.
  
  @param <C> Output type
  @return Instance