options = array(); $this->optionData = array(); if (!empty($packagedOptions)) { $this->hydrate($packagedOptions); } if (!empty($optionData)) { $this->setOptions($optionData); } } /** * Boolean option, accepts 0/1, true/false, yes/no. * @param string $optionName * @return \Workspace\UseCase\Options */ public function optBoolean($optionName, $default = true) { $this->options[$optionName] = array( 'type' => 'boolean', 'default' => $default ); return $this; } /** * Option allowing selection of single item from list. * @param string $optionName * @param array $optionList * @param integer $default * @return \Workspace\UseCase\Options */ public function optOneFromList($optionName, array $optionList, $default = null) { $this->options[$optionName] = array( 'type' => 'select-one', 'list' => $optionList, 'default' => $default ); return $this; } /** * Option allowing selection of multiple items from list. * @param string $optionName * @param array $optionList * @param array $defaults * @return \Workspace\UseCase\Options */ public function optManyFromList($optionName, array $optionList, array $defaults = array()) { $this->options[$optionName] = array( 'type' => 'select-many', 'list' => $optionList, 'default' => $defaults ); return $this; } /** * Package options into an array. * @return array */ public function package() { return $this->options; } /** * Hydrate options from package. * @param array $packagedOptions * @return \Workspace\Contract\Options */ public function hydrate(array $packagedOptions) { $this->options = $packagedOptions; return $this; } /** * Set option inputs. * @param array $optionData * @return \Workspace\UseCase\Options */ public function setOptions(array $optionData) { foreach ($this->options as $option => $spec) { if (!isset($optionData[$option])) { $this->optionData[$option] = $spec['default']; continue; } switch ($this->options[$option]['type']) { case 'boolean': $this->optionData[$option] = ( 1 == $optionData[$option] || true === $optionData[$option] || 'true' == $optionData[$option] || 'yes' == $optionData[$option] ) ? true : false; break; case 'select-one': $this->optionData[$option] = isset($spec['list'][$optionData[$option]]) ? $optionData[$option] : $spec['default']; break; case 'select-many': if (is_array($optionData[$option])) { $this->optionData[$option] = array(); foreach ($optionData[$option] as $opt) { isset($spec['list'][$optionData[$option]]) && $this->optionData[$option][$opt] = $opt; } } else { $this->optionData[$option] = $spec['default']; } break; } } return $this; } /** * Retrieve filtered options. * @return array */ public function getOptions() { return $this->optionData; } }