public function urlFor($criteria, array $options = [])
    {
        if (is_array($criteria)) {
            $pathParams = array_slice($criteria, 1);
            $criteria   = array_shift($criteria);
        } else {
            $pathParams = [];
        }
        
        $token = new ActionToken($criteria);
        
        foreach ($this->routes as $route) {
            $route->build();
            
            if ($route->to() == $token->toString()) {
                if ($path = $this->buildRouteUrl($route, $pathParams, $options)) {
                    if (!empty($options['route'])) {
                        return [$path, $route];
                    }
                    return $path;
                }
            }
        }
        
        $routeParams = implode(', ', array_map(function($name, $val) { return $name . '=>' . $val; }, array_keys($options), $options));
        $message = "Couldn't find route '%s' and options { %s }";
        throw new Exception\InvalidArgumentException(sprintf(
            $message,
            $token->toString(),
            $routeParams
        ));
        # TODO: invalid argument exception?
        return false;
    }