public function main()
    {
        $errorMessages = '';
        for ($i = 0; $i <= $this->retryCount; $i++) {
            try {
                $this->nestedTask->perform();
                break;
            } catch (Exception $e) {
                $errorMessages .= $e->getMessage();
                if ($i >= $this->retryCount) {
                    $taskName = $this->nestedTask->getTaskName();
                    $exceptionMessage = <<<EXCEPTION_MESSAGE
Task [{$taskName}] failed after [{$this->retryCount}] attempts; giving up
Error messages:
$errorMessages
EXCEPTION_MESSAGE;
                    throw new BuildException(
                        $exceptionMessage,
                        $this->getLocation()
                    );
                }

                if ($this->retryDelay > 0) {
                    $msg = sprintf(
                        'Attempt [%s]: error occurred; retrying after %s s...',
                        $i,
                        $this->retryDelay
                    );
                } else {
                    $msg = sprintf(
                        'Attempt [%s]: error occurred; retrying...',
                        $i
                    );
                }

                $this->log($msg, Project::MSG_INFO);
                $errorMessages .= PHP_EOL;

                if ($this->retryDelay > 0) {
                    sleep($this->retryDelay);
                }
            }
        }
    }