/**
  * @param Request $request
  * @param array|Option[] $options
  * @return $this
  * @throws Command\Exception
  */
 public function read(Request $request, array $options)
 {
     foreach ($options as $option) {
         $publicName = $this->getPublicName($option->name);
         if (false !== ($value = $request->request($publicName, false))) {
             if (Option::TYPE_ENUM === $option->type && !isset($option->values[$value])) {
                 throw new Command\Exception('Invalid value for ' . $publicName, Command\Exception::INVALID_VALUE);
             }
             if (!$value && Option::TYPE_VALUE === $option->type) {
                 throw new Command\Exception('Value required for ' . $publicName, Command\Exception::VALUE_REQUIRED);
             }
             if ($option->isVariadic) {
                 if (!is_array($value)) {
                     $value = array($value);
                 }
             }
             if (Option::TYPE_BOOL === $option->type) {
                 $value = (bool) $value;
             }
             $this->values[$option->name] = $value;
         } else {
             if ($option->isRequired) {
                 throw new Command\Exception('Option ' . $publicName . ' required', Command\Exception::OPTION_REQUIRED);
             }
         }
     }
     return $this;
 }