Example #1
0
 /**
  * Replaces all methods in a class with a dummies, except specified.
  *
  * ``` php
  * <?php
  * $user = new User(['name' => 'jon']);
  * test::methods($user, ['getName']);
  * $user->setName('davert'); // not invoked
  * $user->getName(); // jon
  * ?>
  * ```
  *
  * You can create a dummy without a constructor with all methods disabled
  *
  * ``` php
  * <?php
  * $user = test::double('User')->make();
  * test::methods($user, []);
  * ?>
  * ```
  *2
  * @api
  * @param $classOrObject
  * @param array $only
  * @return Core\ClassProxy|Core\InstanceProxy
  * @throws \Exception
  */
 public static function methods($classOrObject, array $only = array())
 {
     $classOrObject = Registry::getRealClassOrObject($classOrObject);
     $isObject = is_object($classOrObject);
     if ($isObject) {
         $reflected = new \ReflectionClass(get_class($classOrObject));
     } else {
         if (!class_exists($classOrObject)) {
             throw new \Exception("Class {$classOrObject} not defined.");
         }
         $reflected = new \ReflectionClass($classOrObject);
     }
     $methods = $reflected->getMethods(\ReflectionMethod::IS_PUBLIC);
     $params = array();
     foreach ($methods as $m) {
         if ($m->isConstructor()) {
             continue;
         }
         if ($m->isDestructor()) {
             continue;
         }
         if (in_array($m->name, $only)) {
             continue;
         }
         $params[$m->name] = null;
     }
     return $isObject ? self::doubleProxy($classOrObject, $params) : self::double($classOrObject, $params);
 }