code: protected function initFromSpecString($specString)
      {
          $pattern = '/
          (
                  (?:[a-zA-Z0-9-]+)
                  (?:
                      \|
                      (?:[a-zA-Z0-9-]+)
                  )?
          )
  
          # option attribute operators
          ([:+?])?
  
          # value types
          (?:=(boolean|string|number|date|file|dir|url|email|ip|ipv6|ipv4))?
          /x';
          $ret = preg_match($pattern, $specString, $regs);
          if ($ret === false || $ret === 0) {
              throw new Exception('Incorrect spec string');
          }
  
          $orig = $regs[0];
          $name = $regs[1];
          $attributes = isset($regs[2]) ? $regs[2] : null;
          $type = isset($regs[3]) ? $regs[3] : null;
  
          $short = null;
          $long = null;
  
          // check long,short option name.
          if (strpos($name, '|') !== false) {
              list($short, $long) = explode('|', $name);
          } else if (strlen($name) === 1) {
              $short = $name;
          } else if (strlen($name) > 1) {
              $long = $name;
          }
  
          $this->short = $short;
          $this->long = $long;
  
          // option is required.
          if (strpos($attributes, ':') !== false) {
              $this->required();
          } else if (strpos($attributes, '+') !== false) {
              // option with multiple value
              $this->multiple();
          } else if (strpos($attributes, '?') !== false) {
              // option is optional.(zero or one value)
              $this->optional();
          } else {
              $this->flag();
          }
          if ($type) {
              $this->isa($type);
          }
      }
docs: Build spec attributes from spec string.
  
  @param string $specString