<?php
/**
 * File containing the ezcMvcMissingRouteArgumentException class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package MvcTools
 * @version //autogentag//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * This exception is thrown when a reverse route is requested with a missing argument
 *
 * @package MvcTools
 * @version //autogentag//
 */
class ezcMvcMissingRouteArgumentException extends ezcMvcToolsException
{
    /**
     * Constructs an ezcMvcMissingRouteArgumentException
     *
     * @param string $pattern
     * @param string $argument
     */
    public function __construct( $pattern, $argument )
    {
        $message = "The argument '{$argument}' was not specified while generating a URL out of the route with pattern '{$pattern}'.";
        parent::__construct( $message );
    }
}
?>
