code: @Override
      public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
          boolean result;
          if (!roundEnv.processingOver()) {
              try {
                  result = onProcess(annotations, roundEnv);
              } catch (GenerationException e) {
                  onError(e);
                  result = true;
              }
          } else {
              try {
                  result = onLastRound(roundEnv);
              } catch (GenerationException e) {
                  onError(e);
                  result = true;
              }
          }
          round++;
          return result;
      }
docs: As long as the processing isn't over {@link #onProcess(Set, RoundEnvironment)} will be called, otherwise
  {@link #onLastRound(RoundEnvironment)} will be called. If there's a {@link GenerationException} thrown,
  {@link #onError(GenerationException)} will be called and this method returns {@code true}.
  
  @param annotations the annotation types requested to be processed
  @param roundEnv    environment for information about the current and prior round
  @return whether or not the set of annotations are claimed by this processor