code: private function generateRouteGeneratorMethod(ModuleDefinition $module, EndpointDefinition $endpoint, string $methodName) : string
      {
          ////////////////////////////////////////////////////////////////////////////////////////////////////////////
          // static uri
          if ($endpoint->isStatic()) {
              return <<<PHP
  
      public function {$methodName}() : string 
      {
          return '{$this->normalizeUri($module->getMountPoint(), $endpoint->getPattern())}';
      }
      
  PHP;
          }
  
          ////////////////////////////////////////////////////////////////////////////////////////////////////////////
          // with parameters
          // TODO: move the logic below into the EndpointDefinition or when creating the EndpointDefinition
          $params = Psi::it($endpoint->getParams())
              ->map(function (string $param) {
                  return '$' . $param;
              })
              ->join(', ');
  
          $result = $endpoint->getPattern();
  
          foreach ($endpoint->getParams() as $param) {
              $result = str_replace('{' . $param . '}', '$' . $param, $result);
          }
  
          return <<<PHP
  
      public function {$methodName}($params) : string 
      {
          return "{$this->normalizeUri($module->getMountPoint(), $result)}";
      }
  
  PHP;
  
      }
docs: @param ModuleDefinition   $module
  @param EndpointDefinition $endpoint
  @param string             $methodName
  
  @return string