/**
  * Maps reflection type
  *
  * @param  php.ReflectionMethod|php.ReflectionParameter $reflect
  * @param  string $name
  * @return php.Closure
  */
 private function mapReflectionType($reflect, $name)
 {
     if ('self' === $name) {
         return function () use($reflect) {
             return new XPClass($reflect->getDeclaringClass());
         };
     } else {
         if ('parent' === $name) {
             return function () use($reflect) {
                 if ($parent = $reflect->getDeclaringClass()->getParentClass()) {
                     return new XPClass($parent);
                 }
                 throw new IllegalStateException('Cannot resolve parent type of class without parent');
             };
         } else {
             return function () use($name) {
                 return Type::forName($name);
             };
         }
     }
 }
 /**
  * Maps a method
  *
  * @param  php.ReflectionMethod $reflect
  * @return [:var]
  */
 protected function method($reflect)
 {
     return ['name' => $reflect->name, 'access' => new Modifiers($reflect->getModifiers() & ~0x1fb7f008), 'holder' => $reflect->getDeclaringClass()->name, 'params' => function () use($reflect) {
         $params = [];
         foreach ($reflect->getParameters() as $pos => $param) {
             $params[] = $this->param($pos, $param);
         }
         return $params;
     }, 'annotations' => function () use($reflect) {
         return $this->methodAnnotations($reflect);
     }, 'invoke' => function ($instance, $args) use($reflect) {
         return $this->invokeMethod($reflect, $instance, $args);
     }, 'comment' => function () use($reflect) {
         if (self::$RETAIN_COMMENTS) {
             return $reflect->getDocComment();
         } else {
             $method = $this->memberDeclaration($this->resolve('\\' . $reflect->getDeclaringClass()->name), 'method', $reflect->name);
             return isset($method['comment']) ? $method['comment'] : null;
         }
     }];
 }