@Override
 public void run() {
   if (finished) throw new IllegalArgumentException("Goal is already finished: " + goal);
   long start = System.currentTimeMillis();
   try {
     super.run(); // calls goalFinished when absofuckinglutely done
     if (pauseReason instanceof TaskDoneReason) {
       Object exitobj = ((TaskDoneReason) pauseReason).exitObj;
       if (exitobj instanceof Error) throw (Error) exitobj;
       if (exitobj instanceof RuntimeException) throw (RuntimeException) exitobj;
     }
   } finally {
     long d = System.currentTimeMillis() - start;
     ++evalCount;
     stats.finishedRun(goal, d);
   }
 }
 @pausable
 public <R extends Result> List<R> evaluate(final Collection<? extends Goal<R>> goals) {
   final List<Slot<R>> slots = new ArrayList<Slot<R>>(goals.size());
   willAddSubgoals();
   try {
     for (Goal<R> goal : goals) slots.add(subgoal(goal));
   } finally {
     didAddSubgoals();
   }
   Task.pause(
       new PauseReason() {
         public boolean isValid() {
           return subgoalCount > 0;
         }
       });
   List<R> results = new ArrayList<R>(slots.size());
   for (Slot<R> slot : slots) results.add(slot.result());
   return results;
 }
 @pausable
 public static AnalysisTask currentTask() {
   return (AnalysisTask) Task.getCurrentTask();
 }