@Value.Lazy
	public NameForms typeValue() {
		if (protoclass().kind().isValue()) {
			return returnsAbstractValueType()
					? typeAbstract()
					: typeImmutable();
		}

		if (protoclass().kind().isJavaBean()) {
			return typeAbstract();
		}

		if (isFactory()) {
			if (protoclass().kind().isRecord()) {
				TypeElement enclosingType = (TypeElement) protoclass().sourceElement();

				return ImmutableConstitution.NameForms.builder()
						.simple(enclosingType.getSimpleName().toString())
						.relativeRaw(enclosingType.getQualifiedName().toString())
						.genericArgs(generics().args())
						.relativeAlreadyQualified(true)
						.packageOf(NA_ERROR)
						.visibility(protoclass().visibility())
						.build();
			}

			if (protoclass().kind().isConstructor()) {
				TypeElement enclosingType = (TypeElement) protoclass().sourceElement().getEnclosingElement();

				return ImmutableConstitution.NameForms.builder()
						.simple(enclosingType.getSimpleName().toString())
						.relativeRaw(enclosingType.getQualifiedName().toString())
						.genericArgs(generics().args())
						.relativeAlreadyQualified(true)
						.packageOf(NA_ERROR)
						.visibility(protoclass().visibility())
						.build();
			}

			ExecutableElement method = (ExecutableElement) protoclass().sourceElement();
			String type = method.getReturnType().toString();

			return ImmutableConstitution.NameForms.builder()
					.simple(NA_ERROR)
					.relativeRaw(type)
					.packageOf(NA_ERROR)
					.relativeAlreadyQualified(true)
					.visibility(protoclass().visibility())
					.build();
		}
		return typeEnclosing();
	}
Value is the canonical outside look of the value type. It should be either
{@link #typeAbstract()} or {@link #typeImmutable()}.
For a factory, it is a special surrogate.
@return canonical value type name forms
value-processor/src/org/immutables/value/processor/meta/Constitution.java