/**
  * Maps a parameter
  *
  * @param  int $pos
  * @param  php.ReflectionParameter $reflect
  * @return [:var]
  */
 protected function param($pos, $reflect)
 {
     if ($type = $reflect->getType()) {
         $type = $this->mapReflectionType($reflect, (string) $type);
     } else {
         $type = null;
     }
     if ($reflect->isVariadic()) {
         $var = true;
         $default = null;
     } else {
         if ($reflect->isOptional()) {
             $var = null;
             $default = function () use($reflect) {
                 return $reflect->getDefaultValue();
             };
         } else {
             $var = false;
             $default = null;
         }
     }
     return ['pos' => $pos, 'name' => $reflect->name, 'type' => $type, 'ref' => $reflect->isPassedByReference(), 'default' => $default, 'var' => $var, 'annotations' => function () use($reflect) {
         return $this->paramAnnotations($reflect);
     }];
 }
 /**
  * Maps annotations
  *
  * @param  php.ReflectionParameter $reflect
  * @return [:var]
  */
 protected function paramAnnotations($reflect)
 {
     $annotations = [];
     foreach ($reflect->getAttributes() as $name => $value) {
         $annotations[$name] = empty($value) ? null : new Value($value[0]);
     }
     return empty($annotations) ? parent::paramAnnotations($reflect) : $annotations;
 }
 /**
  * Maps a parameter
  *
  * @param  int $pos
  * @param  php.ReflectionParameter $reflect
  * @return [:var]
  */
 protected function param($pos, $reflect)
 {
     if ($reflect->isArray()) {
         $type = function () {
             return Type::$ARRAY;
         };
     } else {
         if ($reflect->isCallable()) {
             $type = function () {
                 return Type::$CALLABLE;
             };
         } else {
             if ($class = $reflect->getClass()) {
                 $type = function () use($class) {
                     return new XPClass($class);
                 };
             } else {
                 $type = null;
             }
         }
     }
     if (self::$VARIADIC_SUPPORTED && $reflect->isVariadic()) {
         $var = true;
         $default = null;
     } else {
         if ($reflect->isOptional()) {
             $var = null;
             $default = function () use($reflect) {
                 return $reflect->getDefaultValue();
             };
         } else {
             $var = false;
             $default = null;
         }
     }
     return ['pos' => $pos, 'name' => $reflect->name, 'type' => $type, 'ref' => $reflect->isPassedByReference(), 'default' => $default, 'var' => $var, 'annotations' => function () use($reflect) {
         return $this->paramAnnotations($reflect);
     }];
 }