public synchronized void doWork(final WorkPackage workPackage) {
    int threads = 1; // Manager.get().getEngineSettings().getThreads();
    if (currentStatus == StatusType.idle || pool != threads) {
      pool = threads;
      executor = createExecutor();
    }

    if (workPackage.getWorkList().isEmpty()) {
      return;
    }

    setCurrentStatusAndNotifyListenerIfTypeChanged(StatusType.working);

    workRemaining += workPackage.getWorkList().size();

    startWorkPackage(workPackage);
  }
  private void startWorkPackage(final WorkPackage workPackage) {
    workPackage.start();

    for (final Work work : workPackage.getWorkList()) {
      executor.execute(
          new Runnable() {
            @Override
            public void run() {
              try {
                work.executeWork();
              } finally {
                workCompleted(work, workPackage);
              }
            }
          });
    }
  }