/**
  * @param string                 $interface
  * @param null|object            $bind
  * @param null|ResolverInterface $resolver
  */
 public function __construct($interface, $bind = null, ResolverInterface $resolver = null)
 {
     try {
         ClassInfo::assertInterface($interface);
         parent::__construct(new \ReflectionClass($interface), $bind, $resolver);
     } catch (\Exception $exception) {
         throw $this->getConstructorException(['interface name string', $interface]);
     }
 }
 /**
  * @param string $namespace
  *
  * @return string[]|array[]
  */
 private static final function parseNamespaceContext($namespace)
 {
     $sections = self::getNamespaceSections(self::normalizeSequentialUpperChars($namespace));
     if (ClassInfo::isClass($namespace)) {
         array_pop($sections);
     }
     $transformer = new StringTransform(array_shift($sections));
     $root = (string) $transformer->pascalToSnakeCase();
     return [$root, $sections];
 }
 public function testThrowableEquitable()
 {
     $class = 'SR\\Util\\Test\\Fixture\\IsInstanceOfThrowableFixture';
     $instance = new $class();
     $this->assertTrue(ClassInfo::isThrowableEquitable($class));
     $this->assertTrue(ClassInfo::isThrowableEquitable($instance));
     $class = 'SR\\Util\\Test\\Fixture\\NotInstanceOfThrowableFixture';
     $instance = new $class();
     $this->assertFalse(ClassInfo::isThrowableEquitable($class));
     $this->assertFalse(ClassInfo::isThrowableEquitable($instance));
     $this->assertFalse(ClassInfo::isThrowableEquitable(__NAMESPACE__ . '\\This\\Class\\Does\\Not\\Exist'));
 }
 /**
  * @param string                 $class
  * @param string                 $constant
  * @param null|object            $bindTo
  * @param null|ResolverInterface $resolver
  */
 public function __construct($class, $constant, $bindTo = null, ResolverInterface $resolver = null)
 {
     try {
         parent::__construct(new ReflectionConstant($class, $constant), $bindTo, $resolver);
         if (ClassInfo::isInterface($class)) {
             $this->declaringClass = new InterfaceInspector($class);
         } elseif (ClassInfo::isClass($class)) {
             $this->declaringClass = new ClassInspector($class);
         }
     } catch (\Exception $exception) {
         throw $this->getConstructorException(['class name string', $class], ['constant name string', $constant]);
     }
 }
 /**
  * @param string                 $class
  * @param string                 $method
  * @param null|object            $bindTo
  * @param null|ResolverInterface $resolver
  */
 public function __construct($class, $method, $bindTo = null, ResolverInterface $resolver = null)
 {
     try {
         parent::__construct(new \ReflectionMethod($class, $method), $bindTo, $resolver);
         if (ClassInfo::isTrait($class)) {
             $this->declaringClass = new TraitInspector($class);
         }
         if (!ClassInfo::isTrait($class) && ClassInfo::isClass($class)) {
             $this->declaringClass = new ClassInspector($class);
         }
     } catch (\Exception $exception) {
         throw $this->getConstructorException(['class name string', $class], ['method name string', $method]);
     }
 }
 /**
  * Try to determine the type of passed item and proxies the call to the respective specific this[*] methods.
  *
  * @param object|string $what A class name, object instance, interface name, or trait name
  * @param object|null   $bind Alternate $this binding for internal resolver instance
  *
  * @throws RuntimeException If passed value is not an instance, class, interface or trait
  *
  * @return ClassInspector|ObjectInspector|InterfaceInspector|TraitInspector
  */
 public static function using($what, $bind = null)
 {
     if (ClassInfo::isInstance($what)) {
         return self::useInstance($what, $bind);
     }
     if (ClassInfo::isClass($what)) {
         return self::useClass($what, $bind);
     }
     if (ClassInfo::isInterface($what)) {
         return self::useInterface($what, $bind);
     }
     if (ClassInfo::isTrait($what)) {
         return self::useTrait($what);
     }
     throw RuntimeException::create('Invalid inspector argument provided (got %s)', var_export($what, true));
 }
 /**
  * Filters an array of parameters (the values passed to any of this object's variadic methods) of non-throwables
  * and returns the first found or null if none are found.
  *
  * @param mixed[] $from
  *
  * @return \Throwable[]
  */
 private final function filterThrowable(array $from)
 {
     return array_filter($from, function ($p) {
         return is_object($p) && ClassInfo::isThrowableEquitable($p);
     });
 }
 /**
  * Returns the name of the Twig extension based on the classname.
  *
  * @return string
  */
 public final function getName()
 {
     return strtolower('twig_extension_' . preg_replace('{twigextension$}i', '', ClassInfo::getNameShort(static::class)));
 }