/**
  * @param null|callable $map
  * The unique param it receives id an array with page informations
  *
  * @throws \ApplicationException
  * @throws \SystemException
  */
 public function map($map = null)
 {
     $theme = \Cms\Classes\Theme::getActiveTheme();
     $pages = \Cms\Classes\Page::listInTheme($theme, true);
     if (class_exists('\\RainLab\\Pages\\Classes\\Controller')) {
         // hack RainlabPage's Controller to avoid class name collision
         $classPath = \App::pluginsPath() . '/rainlab/pages/classes/Controller.php';
         file_put_contents($classPath, str_replace('use Cms\\Classes\\Page;', 'use Cms\\Classes\\Page as BasePage;', file_get_contents($classPath)));
         file_put_contents($classPath, str_replace('new Page(', 'new BasePage(', file_get_contents($classPath)));
         // end of hack
         $pages = array_merge($pages, \RainLab\Pages\Classes\Page::listInTheme($theme, true));
     }
     foreach ($pages as $i => $page) {
         if (!isset($this->pageInfos[$page->url])) {
             $this->pageInfos[$page->url] = ['url' => $page->url, 'content' => function () use($page) {
                 return $this->getPageContents($page->url);
             }, 'pageType' => $this->getPageTypeByUrl($page->url), 'urlParameters' => $this->getDynamicParameters($page->url)];
         }
         if (is_callable($map)) {
             $map($this->pageInfos[$page->url]);
         }
     }
 }
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function fire()
 {
     $runAll = array_reduce($this->option(), function ($runAll, $option) {
         if ($runAll) {
             return (bool) $option === true ? false : true;
         }
         return $runAll;
     }, true);
     if ($this->option('regular') || $runAll) {
         // Regular Pages
         $pagesCrawler = new PagesCrawler();
         $pagesCrawler->map(function ($pageInfo) {
             if ($pageInfo['pageType'] == 'regular') {
                 $this->cacheFileHandler->saveCacheFile($pageInfo['url'], $pageInfo['content']());
             }
         });
     }
     if ($this->option('dynamic') || $runAll) {
         // Dynamic Pages
         $mapUrlDynamic = function ($urlDynamic) {
             $length = count($urlDynamic->parameters_lists);
             if ($length > 0) {
                 $this->dynamicRecursiveProcess($urlDynamic->parameters_lists, 0, ['url' => $urlDynamic->url, 'use_internal_url' => $urlDynamic->use_internal_url, 'internal_url' => $urlDynamic->internal_url, 'length' => $length]);
             } else {
                 $this->generateCacheFile(['url' => $urlDynamic->url, 'use_internal_url' => $urlDynamic->use_internal_url, 'internal_url' => $urlDynamic->internal_url, 'length' => $length]);
             }
         };
         if (count($this->option('dynamic-item')) === 0) {
             UrlDynamic::all()->map($mapUrlDynamic);
         } else {
             foreach ($this->option('dynamic-item') as $dynamicId) {
                 $mapUrlDynamic(UrlDynamic::find($dynamicId));
             }
         }
     }
     if ($this->option('blacklist') || $runAll) {
         @mkdir($this->cacheFileHandler->getCachePath(), 0777, true);
         // Index Blacklist
         $indexBlacklist = join('', array_map(function ($url) {
             $url = str_replace('/', '\\/', trim($url, '/'));
             return "(?!\\/{$url})";
         }, UrlBlacklist::all()->lists('url')));
         file_put_contents($this->cacheFileHandler->getCachePath() . '/index-blacklist.config', $indexBlacklist);
         // Route Blacklist
         $routeBlacklist = join('', array_map(function ($url) {
             $url = str_replace('/', '\\/', trim($url, '/'));
             return "(?!{$url})";
         }, UrlBlacklist::all()->lists('url')));
         file_put_contents($this->cacheFileHandler->getCachePath() . '/route-blacklist.config', $routeBlacklist);
         // Param Blacklist
         $paramBlacklist = GetParamBlacklist::all();
         $paramBlacklist->push(['name' => 'nocache', 'values' => json_encode([['value' => '1']])]);
         file_put_contents($this->cacheFileHandler->getCachePath() . '/param-blacklist.config', $paramBlacklist->toJson());
         // Param Blacklist function
         copy(\App::pluginsPath() . '/ebussola/statefull/assets/param-blacklist-function.php', $this->cacheFileHandler->getCachePath() . '/param-blacklist-function.php');
     }
 }