@SetupRender
  final void setup() {
    // Often, these controlName and clientId will end up as the same value. There are many
    // exceptions, including a form that renders inside a loop, or a form inside a component
    // that is used multiple times.

    if (formSupport == null)
      throw new RuntimeException(
          String.format(
              "Component %s must be enclosed by a Form component.", resources.getCompleteId()));

    assignedClientId = allocateClientId();

    String controlName = formSupport.allocateControlName(resources.getId());

    formSupport.storeAndExecute(this, new Setup(controlName));
    formSupport.store(this, PROCESS_SUBMISSION_ACTION);
  }