code: private Observable<Indexable> invokeInternAsync(final InvocationContext context,
                                                      final boolean shouldRunBeforeGroupInvoke,
                                                      final Set<String> skipBeforeGroupInvoke) {
          if (!isPreparer()) {
              return Observable.error(new IllegalStateException("invokeInternAsync(cxt) can be called only from root TaskGroup"));
          }
          this.taskGroupTerminateOnErrorStrategy = context.terminateOnErrorStrategy();
          if (shouldRunBeforeGroupInvoke) {
              // Prepare tasks and queue the ready tasks (terminal tasks with no dependencies)
              //
              this.runBeforeGroupInvoke(skipBeforeGroupInvoke);
          }
          // Runs the ready tasks concurrently
          //
          return this.invokeReadyTasksAsync(context);
      }
docs: Invokes tasks in the group.
  
  @param context group level shared context that need be passed to invokeAsync(cxt)
  method of each task item in the group when it is selected for invocation.
  @param shouldRunBeforeGroupInvoke indicate whether to run the 'beforeGroupInvoke' method
  of each tasks before invoking them
  @param skipBeforeGroupInvoke the tasks keys for which 'beforeGroupInvoke' should not be called
  before invoking them
  @return an observable that emits the result of tasks in the order they finishes.