code: public ParamDef<?> createParam(Object instance, ReflectionParameter param) {
          Objects.requireNonNull(instance, "instance");
          Objects.requireNonNull(param, "param");
          try {
              for (MethodParamFactory<?> factory : factories) {
                  final Opt<? extends ParamDef<?>> def = factory.create(instance, param);
                  if (def.isPresent()) {
                      return def.get();
                  }
              }
          } catch (Exception e) {
              throw SneakyException.sneakyThrow(e);
          }
  
          // No factory accepted this param.
          throw new IllegalArgumentException("Invalid param: class="+instance.getClass()+", param=" + param);
      }
docs: Create a {@link ParamDef}s out of a method parameter with optional annotations, through reflection.
  Since parameter names aren't always available to be reflected, parameter names can only be set through
  the annotation. If absent, a name will be generated for the parameter.
  
  @param instance The instance that contains the method this parameter is being constructed for.
  @param param Information about the parameter.
  @return A {@link ParamDef} constructed from the parameter.
  @throws IllegalArgumentException If the parameter wasn't accepted by any of the {@link MethodParamFactory}s.
  This means the parameter is of an incompatible type.