code: private void process() {
      metadataBuilder = ConstructorMetadata.newBuilder().setClazz(clazz);
      MethodHandle mh = IntrospectionUtils.findDefaultConstructor(clazz);
      if (mh != null) {
        metadataBuilder.setConstructionStrategy(ConstructorMetadata.ConstructionStrategy.CLASSIC)
            .setConstructorMethodHandle(mh);
        // We have everything we need for the classic pattern with a default
        // constructor and accessor/mutator methods, more validations will
        // follow.
        return;
      }
      // Now we check for Builder pattern usage
      mh = findNewBuilderMethod(clazz);
      if (mh == null) {
        final String pattern = "Class %s requires a public no-arg constructor or a public static "
            + "method that returns a corresponding Builder instance. The name of the static method "
            + "can either be %s or %s";
        String error = String.format(pattern, clazz.getName(), METHOD_NAME_NEW_BUILDER,
            METHOD_NAME_BUILDER);
        throw new UnsupportedConstructionStrategyException(error);
      }
      Class<?> builderClass = mh.type().returnType();
      metadataBuilder.setConstructionStrategy(ConstructorMetadata.ConstructionStrategy.BUILDER)
          .setConstructorMethodHandle(mh).setBuilderClass(builderClass);
      MethodHandle buildMethodHandle = IntrospectionUtils.findInstanceMethod(builderClass,
          METHOD_NAME_BUILD, clazz);
      if (buildMethodHandle == null) {
        String pattern = "Class %s requires a public instance method, %s, with a return type of %s";
        throw new EntityManagerException(
            String.format(pattern, builderClass.getName(), METHOD_NAME_BUILD, clazz));
      }
      metadataBuilder.setBuildMethodHandle(buildMethodHandle);
    }
docs: Introspects the class and builds the metadata.