private void checkConstructability(ValueType type) {
    if (!type.isUseBuilder() || type.isUseConstructor()) {
      for (ValueAttribute a : type.getConstructorExcluded()) {
        if (a.isMandatory()) {
          a.report()
              .error("Attribute '%s' is mandatory and should be a constructor"
                  + " @Value.Parameter when builder is disabled or"
                  + " there are other constructor parameters",
                  a.name());
        }
      }
    }
    if (!type.isUseBuilder() && !type.isUseCopyMethods()) {
      for (ValueAttribute a : type.getConstructorExcluded()) {
        if (!a.isMandatory()) {
          a.report()
              .warning(About.INCOMPAT,
                  "There is no way to initialize '%s' attribute to non-default value."
                      + " Enable builder=true or copy=true or add it as a constructor @Value.Parameter",
                  a.name());
        }
      }
    }
    if (type.isUseSingleton() && !type.getMandatoryAttributes().isEmpty()) {
      for (ValueAttribute a : type.getMandatoryAttributes()) {
        a.report()
            .error("Attribute '%s' is mandatory and cannot be used with singleton enabled."
                + " Singleton instance require all attributes to have default value, otherwise"
                + " default instance could not be created",
                a.name());
      }
    }
  }
It may grow later in some better abstraction, but as it stands now, currently it is
just a glue between new "protoclass" model and old discovery routines.
value-processor/src/org/immutables/value/processor/meta/ValueTypeComposer.java