public static function isValid($oRouteDictionary)
 {
     if (!is_array($oRouteDictionary) && !$oRouteDictionary instanceof InterfaceConfigSource) {
         throw new InvalidArgumentException("Argument #1 doit être un tableau ou un objet implémentant A\\ouka\\ConfigSource\\InterfaceConfigSource.");
     }
     if (is_array($oRouteDictionary)) {
         $oRouteDictionary = new PHPArray(uniqid(), $oRouteDictionary);
     }
     self::_reset();
     $aValidRouteDefinitions = [];
     // Le type de dictionnaire est-il défini et correct ?
     if (self::_isValidDictionaryType($oRouteDictionary->getValue())) {
         // Existe-t-il au moins une route définie ?
         $aRouteDefinitions = $oRouteDictionary->getAllValues(AbstractRouting::ROUTE);
         if ($aRouteDefinitions) {
             // Pour chacune des définitions...
             foreach ($aRouteDefinitions as $aRouteDefinition) {
                 // On harmonise les définitions uniques avec les définitions en liste
                 // pour ça, on passe toutes les définitions uniques en liste.
                 if (ArrayHelper::isAssociative($aRouteDefinition)) {
                     $aRouteDefinition = [$aRouteDefinition];
                 }
                 foreach ($aRouteDefinition as $aRouteDef) {
                     $oRouteDefinition = new PHPArray(uniqid(), $aRouteDef);
                     //... on récupère l'ID
                     $mRouteId = $oRouteDefinition->getValue(AbstractRouting::ID, null);
                     if (!is_string($mRouteId)) {
                         self::_recordInvalid($aRouteDef, "La propriété " . AbstractRouting::ID . " est obligatoire et doit être définie en tant que chaîne de caractères.");
                     } else {
                         if (static::_isValidParam($aRouteDef)) {
                             $aValidRouteDefinitions[] = $aRouteDef;
                         }
                     }
                 }
             }
         }
     }
     return $aValidRouteDefinitions;
 }