protected function detectRoutes(ReferenceLink $rootLink, array $referencePaths) {
        $routeId = 0;
        foreach ($referencePaths as $referencePath => $required) {
            // preparing possible routes
            $referenceRoutes = $rootLink->prepareRoutes($referencePath);

            // selecting 'the best' route
            $selectedRoute = NULL;
            if (isset($referenceRoutes)) {
                foreach ($referenceRoutes as $directReferenceFlag => $routes) {
                    foreach ($routes as $route) {
                        if (!isset($selectedRoute) || ($selectedRoute->weight > $route->weight)) {
                            $selectedRoute = $route;
                        }
                    }
                }
            }

            if (isset($selectedRoute)) {
                $rootLink->assignRouteId($selectedRoute, $routeId);
                $routeId++;
            }
            elseif ($required) {
                $metamodel = data_controller_get_metamodel();

                LogHelper::log_error(t('Could not execute reference path: @referencePath', array('@referencePath' => $referencePath)));

                list($referencedDatasetName) = ReferencePathHelper::splitReference($referencePath);
                $referencedDataset = $metamodel->getDataset($referencedDatasetName);

                throw new IllegalArgumentException(t(
                    '%datasetNameA and %datasetNameB datasets are not connected',
                    array('%datasetNameA' => $rootLink->dataset->publicName, '%datasetNameB' => $referencedDataset->publicName)));
            }
        }
    }