docs: public void evaluate() throws Exception
      {
          if (current == null)
          {
              compile();
          }
          StateWrapper candidate = null;
          for (Entry<BooleanSupplier,State> e : current.transitions.entrySet())
          {
              if (e.getKey().getAsBoolean())
              {
                  if (candidate != null)
                  {
                      throw new IllegalArgumentException("transition from state "+current+" to two states at the same time: "+candidate.toString()+" and "+e.getValue());
                  }
                  candidate = (StateWrapper) e.getValue();
              }
          }
          if (candidate != null)
          {
              current.exit();
              current = candidate;
              stateStartTime = clockSupplier.get().millis();
              current.enter();
          }
          current.run();
      }