/**
  * Generates the routing files from the controllers.
  *
  * @return bool Returns true
  * @throws \Exception
  */
 public static function generateRoutes() : bool
 {
     $controllersList = scandir(Settings::getControllersPath());
     foreach ($controllersList as $controllerFile) {
         $module = explode('_', $controllerFile)[0];
         if ($module && $controllerFile != '..' && $controllerFile != '.') {
             $routesRootFile = Settings::getRoutesFile();
             $routesRoot = file_exists($routesRootFile) ? YAML::load($routesRootFile) : array();
             $routesRootModuleMatch = false;
             foreach ($routesRoot as $route) {
                 if (isset($route['module'])) {
                     if ($route['module'] == $module) {
                         $routesRootModuleMatch = true;
                     }
                 }
             }
             if ($routesRootModuleMatch == false) {
                 $newRoute = array('module' => $module, 'route' => sprintf('^%s/', $module), 'name' => $module);
                 array_unshift($routesRoot, $newRoute);
             }
             $routesRootYaml = YAML::dump($routesRoot);
             file_put_contents($routesRootFile, $routesRootYaml);
             $includeFile = sprintf('%s/%s', Settings::getControllersPath(), $controllerFile);
             include $includeFile;
             $objecReflection = new \ReflectionClass(ucfirst($module));
             $publicMethodsList = $objecReflection->getMethods(\ReflectionMethod::IS_PUBLIC);
             $moduleRoutesFile = sprintf('%s/%s_routes.yml', Settings::getRoutesPath(), $module);
             if (file_exists($moduleRoutesFile)) {
                 $moduleRoutesList = YAML::load($moduleRoutesFile);
             } else {
                 $moduleRoutesList = array();
             }
             foreach ($publicMethodsList as $method) {
                 $methodParameters = $method->getParameters();
                 $paramsPattern = array();
                 $isInRoutesList = false;
                 foreach ($methodParameters as $param) {
                     $paramsPattern[] = sprintf('(?P<%s>\\w+)', $param->getName());
                 }
                 foreach ($moduleRoutesList as $key => $route) {
                     if (isset($route['name'])) {
                         if ($route['name'] == $method->getName()) {
                             $isInRoutesList = true;
                             if (sizeof($paramsPattern)) {
                                 $moduleRoutesList[$key]['route'] = sprintf('^%s/%s$', $method->getName(), implode('/', $paramsPattern));
                             } else {
                                 $moduleRoutesList[$key]['route'] = sprintf('^%s$', $method->getName());
                             }
                         }
                     }
                 }
                 if (!$isInRoutesList) {
                     if (sizeof($paramsPattern)) {
                         $moduleRoutesList[] = array('route' => sprintf('^%s/%s$', $method->getName(), implode('/', $paramsPattern)), 'controller' => $method->getName(), 'name' => $method->getName());
                     } else {
                         $moduleRoutesList[] = array('route' => sprintf('^%s$', $method->getName()), 'controller' => $method->getName(), 'name' => $method->getName());
                     }
                 }
             }
             $moduleRoutesYaml = YAML::dump($moduleRoutesList);
             file_put_contents($moduleRoutesFile, $moduleRoutesYaml);
             unset($objecReflection);
         }
     }
     return true;
 }