public function __call($name, $params)
 {
     if (substr($name, 0, 7) === 'public_') {
         $name = substr($name, 7);
         if (method_exists($this, $name)) {
             return call_user_func_array(array($this, $name), $params);
         }
     }
     $parents = class_parents($this);
     if (is_array($parents)) {
         foreach ($parents as $classname) {
             if (method_exists($classname, '__call')) {
                 return parent::__call($name, $params);
             }
         }
     }
     throw new Exception("Method {$name} does not exist for this class");
 }