docs: public DynamicType.Builder<?> subclass(TypeDefinition superType, ConstructorStrategy constructorStrategy) {
          TypeDescription.Generic actualSuperType;
          TypeList.Generic interfaceTypes;
          if (superType.isPrimitive() || superType.isArray() || superType.isFinal()) {
              throw new IllegalArgumentException("Cannot subclass primitive, array or final types: " + superType);
          } else if (superType.isInterface()) {
              actualSuperType = TypeDescription.Generic.OBJECT;
              interfaceTypes = new TypeList.Generic.Explicit(superType);
          } else {
              actualSuperType = superType.asGenericType();
              interfaceTypes = new TypeList.Generic.Empty();
          }
          return new SubclassDynamicTypeBuilder<Object>(instrumentedTypeFactory.subclass(namingStrategy.subclass(superType.asGenericType()),
                  ModifierContributor.Resolver.of(Visibility.PUBLIC, TypeManifestation.PLAIN).resolve(superType.getModifiers()),
                  actualSuperType).withInterfaces(interfaceTypes),
                  classFileVersion,
                  auxiliaryTypeNamingStrategy,
                  annotationValueFilterFactory,
                  annotationRetention,
                  implementationContextFactory,
                  methodGraphCompiler,
                  typeValidation,
                  visibilityBridgeStrategy,
                  classWriterStrategy,
                  ignoredMethods,
                  constructorStrategy);
      }