final public function run()
    {
        $this->notify("run");

        $this->addOptions();

        $this->notify("options added");

        $this->populateOptions();

        $this->addHelpCommand();

        $this->notify("options available");

        if ($this->option("help")) {
            return $this->printHelp();
        }

        $this->notify("pre main");

        try {
            $status = $this->main();
        } catch (\Exception $e) {
            $status = $this->catchMainException($e);
        }

        $this->notify("shutdown");

        return $status;
    }