private void initAttributeValueType() {
    if ((style().deepImmutablesDetection()
        || style().attributeBuilderDetection()
        || containingType.isGenerateCriteria())
        && containedTypeElement != null) {
      // prevent recursion in case we have the same type
      if (CachingElements.equals(containedTypeElement, containingType.element)) {
        // We don't propagate type arguments so we don't support it, sorry
        if (containingType.generics().isEmpty()) {
          this.attributeValueType = containingType;
        }
      } else {
        Environment environment = protoclass().environment();
        for (Protoclass p : environment.protoclassesFrom(Collections.singleton(containedTypeElement))) {
          // TODO (?) p.kind().isRecord()
          if ((p.kind().isDefinedValue() || p.kind().isModifiable() || p.kind().isJavaBean())
              && canAccessImplementation(p)
              && p.constitution().generics().isEmpty()) {
            this.attributeValueType = environment.composeValue(p);
          }
          break;
        }
      }
    }
  }
Initialized Validates things that were not validated otherwise
@param instantiationCreator can instantiate encodings
value-processor/src/org/immutables/value/processor/meta/ValueAttribute.java