private function parse()
{
$options = array('file', 'help', 'version', 'collector', 'generator', 'engines', 'enrichers', 'backends', 'skel', 'strip');
$shortMap = array('f' => 'file', 'h' => 'help', 'c' => 'collector', 'g' => 'generator', 'v' => 'version');
$valueOptions = array('file');
$conflictingOptions = array('collector' => array('generator'), 'generator' => array('collector'));
$argv = $this->argv;
array_map('trim', $argv);
if (isset($argv[0][0]) && $argv[0][0] != '-') {
array_shift($argv);
}
foreach ($options as $opt) {
$this->parsed[$opt] = FALSE;
}
$valueExcepted = false;
$argName = '';
foreach ($argv as $arg) {
if ($arg[0] == '-') {
if (strlen($arg) == 1) {
throw new CLIOptionsException(sprintf('Syntax error while parsing option (unnamed switch or option)'));
}
if ($arg[1] == '-') {
$argName = mb_substr($arg, 2);
if (!in_array($argName, $options)) {
throw new CLIOptionsException(sprintf('Option "%s" is not defined', $argName));
}
} else {
$argChar = mb_substr($arg, 1);
if (!isset($shortMap[$argChar])) {
throw new CLIOptionsException(sprintf('Option "%s" is not defined', $argChar));
}
$argName = $shortMap[$argChar];
}
if (isset($conflictingOptions[$argName])) {
foreach ($conflictingOptions[$argName] as $conflict) {
if ($this->parsed[$conflict]) {
throw new CLIOptionsException(sprintf('Option "%s" conflicts with already set option "%s"', $argName, $conflict));
}
}
}
$this->parsed[$argName] = TRUE;
$valueExcepted = in_array($argName, $valueOptions);
continue;
}
if (!$valueExcepted) {
throw new CLIOptionsException(sprintf('Value for option "%s" provided but none expected', $argName));
}
$this->parsed[$argName] = $arg;
}
}