@Override
 public final void init(ProcessingEnvironment env) {
   super.init(env);
   JavacTask.instance(env).addTaskListener(listener);
   Context ctx = ((JavacProcessingEnvironment) processingEnv).getContext();
   JavaCompiler compiler = JavaCompiler.instance(ctx);
   compiler.shouldStopPolicyIfNoError =
       CompileState.max(compiler.shouldStopPolicyIfNoError, CompileState.FLOW);
 }
 public static void add(ProcessingEnvironment env, Runnable r) {
   try {
     JavacTask task = JavacTask.instance(env);
     TaskListener l = ((BasicJavacTask) task).getTaskListeners().iterator().next();
     // The TaskListener is an instanceof TestClose, but when using the
     // default class loaders. the taskListener uses a different
     // instance of Class<TestClose> than the anno processor.
     // If you try to evaluate
     //      TestClose tc = (TestClose) (l).
     // you get the following somewhat confusing error:
     //   java.lang.ClassCastException: TestClose cannot be cast to TestClose
     // The workaround is to access the fields of TestClose with reflection.
     Field f = l.getClass().getField("runnables");
     @SuppressWarnings("unchecked")
     List<Runnable> runnables = (List<Runnable>) f.get(l);
     runnables.add(r);
   } catch (Throwable t) {
     t.printStackTrace();
   }
 }