code: @Override
  	public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
  		try {
  			count++;
  			if (count == 1) {
  
  				many2ManyProcessor.clear();
  				typeProcessor.clear();
  				sharedPreferencesProcessor.clear();
  				dataSourceProcessor.clear();
  
  				// generate @BindGeneratedDao
  				many2ManyProcessor.process(annotations, roundEnv);
  
  				// generate bindmap
  				typeProcessor.process(annotations, roundEnv);
  
  				sharedPreferencesProcessor.process(annotations, roundEnv);
  				sharedPreferencesProcessor.generateClasses();
  
  				dataSourceProcessor.generatedEntities = many2ManyProcessor.result.value0;
  				dataSourceProcessor.generatedDaos = many2ManyProcessor.result.value1;
  				// dump(1, roundEnv);
  				dataSourceProcessor.analyzeRound(annotations, roundEnv);
  				dataSourceProcessor.process(annotations, roundEnv);
  				dataSourceProcessor.generateClasses(roundEnv);
  			} else if (count == 2) {
  				dataSourceProcessor.analyzeSecondRound(annotations, roundEnv);
  				dataSourceProcessor.processSecondRound(annotations, roundEnv);
  				dataSourceProcessor.generateClassesSecondRound(roundEnv);
  			}
  
  			return true;
  		} catch (Throwable e) {
  			String msg = StringUtils.nvl(e.getMessage());
  			error(null, e.getClass().getCanonicalName() + ": " + msg);
  
  			if (DEBUG_MODE) {
  				if (JUNIT_TEST_MODE) {
  					logger.log(Level.SEVERE, msg);
  					//e.printStackTrace();
  				} else {
  					StackTraceElement[] stackTrace = e.getStackTrace();
  					for (StackTraceElement item : stackTrace) {
  						error(null, String.format("\tat %s.%s(%s:%s)", item.getClassName(), item.getMethodName(), item.getFileName(), item.getLineNumber()));
  					}					
  				}
  			}
  			return false;
  		}
  
  	}
docs: /*
  (non-Javadoc)
  
  @see javax.annotation.processing.AbstractProcessor#process(java.util.Set, javax.annotation.processing.RoundEnvironment)