- <?php 
-   
- class Phone 
- { 
-     public function addnewnumber($name, $number) 
-     { 
-         echo "Phone::addnnewnumber\n"; 
-     } 
- } 
-   
- class Proxy 
- { 
-     private $_target; 
-     public function __construct($target) 
-     { 
-         $this->_target = $target; 
-     } 
-   
-     public function __call($name, $params) 
-     { 
-         $callable = array($this->- _target , $name);
 
-                            get_class($this->- _target ).'::'.$name, E_USER_ERROR);
 
-         } 
-   
-         return $this->dispatch($callable, $params); 
-     } 
-   
-     protected function dispatch($callable, $params) 
-     { 
-     } 
- } 
-   
- class LoggingProxy extends Proxy 
- { 
-     protected function dispatch($callable, $params) 
-     { 
-         echo "Before calling ".get_class($callable[0]).'::'.$callable[1]."\n"; 
-         $return = parent::dispatch($callable, $params); 
-         echo "After calling ".get_class($callable[0]).'::'.$callable[1]."\n"; 
-         return $return; 
-     } 
- }   
-   
- $a = new LoggingProxy(new Phone); 
- $a->addnewnumber(1, 2); 
				PD9waHAKCmNsYXNzIFBob25lCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRuZXdudW1iZXIoJG5hbWUsICRudW1iZXIpCiAgICB7CiAgICAgICAgZWNobyAiUGhvbmU6OmFkZG5uZXdudW1iZXJcbiI7CiAgICB9Cn0KCmNsYXNzIFByb3h5CnsKICAgIHByaXZhdGUgJF90YXJnZXQ7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRhcmdldCkKICAgIHsKICAgICAgICAkdGhpcy0+X3RhcmdldCA9ICR0YXJnZXQ7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoJG5hbWUsICRwYXJhbXMpCiAgICB7CiAgICAgICAgJGNhbGxhYmxlID0gYXJyYXkoJHRoaXMtPl90YXJnZXQsICRuYW1lKTsKICAgICAgICBpZiAoIWlzX2NhbGxhYmxlKCRjYWxsYWJsZSkpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcignQ2FsbCB0byB1bmRlZmluZWQgbWV0aG9kICcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jbGFzcygkdGhpcy0+X3RhcmdldCkuJzo6Jy4kbmFtZSwgRV9VU0VSX0VSUk9SKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZGlzcGF0Y2goJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgIH0KICAgIAogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BhdGNoKCRjYWxsYWJsZSwgJHBhcmFtcykKICAgIHsKICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgIH0KfQoKY2xhc3MgTG9nZ2luZ1Byb3h5IGV4dGVuZHMgUHJveHkKewogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BhdGNoKCRjYWxsYWJsZSwgJHBhcmFtcykKICAgIHsKICAgICAgICBlY2hvICJCZWZvcmUgY2FsbGluZyAiLmdldF9jbGFzcygkY2FsbGFibGVbMF0pLic6OicuJGNhbGxhYmxlWzFdLiJcbiI7CiAgICAgICAgJHJldHVybiA9IHBhcmVudDo6ZGlzcGF0Y2goJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgICAgICBlY2hvICJBZnRlciBjYWxsaW5nICIuZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkuJzo6Jy4kY2FsbGFibGVbMV0uIlxuIjsKICAgICAgICByZXR1cm4gJHJldHVybjsKICAgIH0KfSAgCgokYSA9IG5ldyBMb2dnaW5nUHJveHkobmV3IFBob25lKTsKJGEtPmFkZG5ld251bWJlcigxLCAyKTs=