code: public T build() {
          long start = System.currentTimeMillis();
          long sleepingFor = start + timeout - System.currentTimeMillis();
          T result;
          try {
              result = statement.call();
              while (comparer.call(result) && 0 < sleepingFor) {
                  LOGGER.debug("Sleeping on: {}", name);
                  LOGGER.debug("Wake up in: {}", sleepingFor);
                  try {
                      Thread.sleep(interval);
                  } catch (InterruptedException ex) {
                      LOGGER.error("Sleeper: " + name + " interupted!", ex);
                      break;
                  }
                  sleepingFor = start + timeout - System.currentTimeMillis();
                  result = statement.call();
              };
          } catch (Exception ex) {
              LOGGER.error("Callable on sleeper: " + name + " throwed exception!", ex);
              throw new SystemException("Callable on sleeper: " + name + " throwed exception!", ex);
          }
          return result;
      }
docs: Causes the current thread to wait until the value returned by statement
  is evaluated by comparer to {@code false}, or the specified waiting time
  elapses.
  
  <p>
  Condition is checked with interval.
  
  <p>
  Any {@code InterruptedException}'s are suppress and logged. Any
  {@code Exception}'s thrown by callable are propagate as SystemException
  
  @return value returned by callable method
  @throws SystemException if callable throws exception