<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
* This file defines PEAR_Delegator exception classes.
*
* @package    PEAR_Delegator
* @author     Michael Witten <lingwitt@yahoo.com>
* @copyright  2004-2005 Michael Witten
* @license    http://www.php.net/license/3_0.txt  PHP License 3.0
* @link       http://pear.php.net/package/PEAR_Delegator
*/

// /* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 5                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available through the world-wide-web at the following url:           |
// | http://www.php.net/license/3_0.txt.                                  |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Michael Witten 4100 85 <LingWitt@yahoo.com>                 |
// |          Martin Jansen <mj@php.net> for overwhelming encouragement   |
// +----------------------------------------------------------------------+
// 4100 85
// $Id$

require_once 'PEAR/Exception.php';

/**
* This class is the base class for all delegator exceptions.
*
* @since PHP 5.0.0
* @author Michael Witten <LingWitt@yahoo.com> 4100 85
* @see http://pear.php.net/manual/
* @package PEAR_Delegator
*/
class PEAR_Delegator_Exception extends PEAR_Exception
{
}

class
PEAR_Delegator_ExceptionDelegateUndefined extends PEAR_Delegator_Exception
{
    
/**
     * Constructs a PEAR_Delegator_ExceptionDelegateUndefined.
     *
     * This exception is thrown when adding a static delegate that has not been defined
     *
     * @see PEAR_Delegator::addDelegate()
     * @param mixed  $delegate  This is the undefined delegate. It can be a string.
     * @param string $method    The offending method.
     */
    
public function __construct($delegate, $func = 'addDelegate')
    {        
        
$backtraceArray = $this->getTrace();
        
        
$file   = 'unknown file';
        
$line   = 'unknown';
        
        foreach (
$backtraceArray as $index => $fileRecord) {
            
$function = $fileRecord['function'];
            if (
strtolower($function) == strtolower($func)) {                    
                if (
array_key_exists('file', $fileRecord)) {
                    
$file = $backtraceArray[++$index]['file'];
                    
$line = $backtraceArray[$index]['line'];
                }
                
                
$class = $fileRecord['class'];
                
                break;
            }
        }
        
        
parent::__construct("Class '$delegate' not found in <b>$file</b> on line <b>$line</b>");
    }
}

class
PEAR_Delegator_ExceptionMethodUndefined extends PEAR_Delegator_Exception
{
    
/**
     * Constructs a PEAR_Delegator_ExceptionMethodUndefined.
     *
     * This exception is thrown when the forwarding mechanism cannot find an implementor
     * for the given method.
     *
     * @see PEAR_Delegator::__call(), PEAR_Delegator::cacheMethod()
     * @param string $method This is the undefined method.
     */
    
public function __construct($method)
    {
        
$backtraceArray = $this->getTrace();
        
        
$file   = 'unknown file';
        
$line   = 'unknown';
        
        foreach (
$backtraceArray as $fileRecord) {
            
$function = $fileRecord['function'];
            if (
strtolower($function) == strtolower($method)) {                    
                if (
array_key_exists('file', $fileRecord)) {
                    
$file = $fileRecord['file'];
                    
$line = $fileRecord['line'];
                }
                
                
$class = $fileRecord['class'];
                
                break;
            }
        }
        
        
parent::__construct("Call to undefined method $class::$function() in <b>$file</b> on line <b>$line</b>");
    }
}
?>