<?php

require_once 'PEAR.php';
class 
PEAR_Error_Proxy extends PEAR
{
    var 
$obj;

    function 
__construct($obj)
    {
        
$this->obj $obj;
    }

    function 
__call($method$params)
    {
        try {
            
$result call_user_func_array(array(&$this->obj$method), $params);
        } catch (
PEAR_Exception $e) {
            
// add all context information
            
$result PEAR::raiseError($e->getMessage());
        }
        return 
$result;
    }

    function 
isInstanceOf($class)
    {
        return (
$this->obj instanceOf $class);
    }
}

require_once 
'PEAR/Exception.php';
class 
PEAR_Exception_Proxy extends PEAR
{
    var 
$obj;

    function 
__construct($obj)
    {
        
$this->obj $obj;
    }

    function 
__call($method$params)
    {
        
$result call_user_func_array(array(&$this->obj$method), $params);
        if (
PEAR::isError($result)) {
            
// add all context information
            
throw new PEAR_Exception($result->getMessage());
        }
        return 
$result;
    }

    function 
isInstanceOf($class)
    {
        return (
$this->obj instanceOf $class);
    }
}

class 
PEAR_Some_Package
{
    function 
factory($error_proxy false)
    {
        
$obj = new PEAR_Some_Package();
        if (
$error_proxy) {
            
var_dump("Use error proxy: $error_proxy");
            
$obj = new $error_proxy($obj);
        }
        return 
$obj;
    }

    function 
isInstanceOf($class)
    {
        return (
$this instanceOf $class);
    }

    function 
causePEARException()
    {
        
var_dump(__METHOD__);
        throw new 
PEAR_Exception('Some serious error');
    }

    function 
causePEARError()
    {
        
var_dump(__METHOD__);
        
$result PEAR::raiseError('Some serious error');
        return 
$result;
    }
}

$obj PEAR_Some_Package::factory();
try {
    
$result $obj->causePEARException();
} catch (
PEAR_Exception $e) {
    
var_dump('Caught PEAR_Exception: '.$e->getMessage());
}
$result $obj->causePEARError();
if (
PEAR::isError($result)) {
    
var_dump('Caught PEAR_Error: '.$result->getMessage());
}

var_dump('Is instance of PEAR_Some_Package?');
var_dump(($obj->isInstanceOf('PEAR_Some_Package') ? 'Yes' 'No'));

$obj PEAR_Some_Package::factory('PEAR_Error_Proxy');
$result $obj->causePEARException();
if (
PEAR::isError($result)) {
    
var_dump('Caught PEAR_Error: '.$result->getMessage());
}

var_dump('Is instance of PEAR_Some_Package?');
var_dump(($obj->isInstanceOf('PEAR_Some_Package') ? 'Yes' 'No'));

$obj PEAR_Some_Package::factory('PEAR_Exception_Proxy');
try {
    
$result $obj->causePEARError();
} catch (
PEAR_Exception $e) {
    
var_dump('Caught PEAR_Exception: '.$e->getMessage());
}

var_dump('Is instance of PEAR_Some_Package?');
var_dump(($obj->isInstanceOf('PEAR_Some_Package') ? 'Yes' 'No'));

?>