Cuando un método no esta explicitamente declarado para un objeto, PHP 5 puede pasar la ejecución a un método especial llamado __call().
<?php
    
class Delegador {
        private 
gato;
        private 
perro;
        
        function 
__construct() {
            
$this->gato = new Gato();
            
$this->perro = new Perro()
        }
        
        function 
__call($methodName$args) {
            if (
$methodName == 'maulla') {
                return 
$this->gato->maulla($args);
            } else (
                return 
$this->perro->$methodName($args);
            }
        }
    }
    
    
$obj = new Delegador();
    echo 
$obj->ladra('fuerte');  // usa al perro
    
echo $obj->maulla('suave');  // usa al gato
    
echo $obj->muerde(); // el perro de nuevo
?>