/**
  * Creates an instance of the target class.
  *
  */
 public function setupTargetInstance()
 {
     if (!property_exists($this, 'target')) {
         return;
     }
     $spec = $this->target;
     if (is_string($spec)) {
         $this->target = new $spec();
         return;
     }
     $testNameParts = explode(' ', $this->getName());
     $testName = array_shift($testNameParts);
     $testSet = trim(array_pop($testNameParts), '"');
     $testNameKey = '@' . $testName;
     $testNameSetKey = $testNameKey . '|' . $testSet;
     $testSpec = isset($spec[$testNameKey]) ? $spec[$testNameKey] : (isset($spec[$testNameSetKey]) ? $spec[$testNameSetKey] : null);
     if (!is_array($spec) || false === $testSpec) {
         $this->target = null;
         return;
     }
     if (null !== $testSpec) {
         if (is_string($testSpec)) {
             if (class_exists($testSpec)) {
                 $testSpec = [$testSpec];
             } else {
                 $this->target = $this->{$testSpec}();
                 return;
             }
         }
         /* Override specs for specific test */
         foreach ($testSpec as $key => $value) {
             $spec[$key] = $value;
         }
     }
     if (isset($spec[0])) {
         $spec['class'] = $spec[0];
     }
     if (!isset($spec['args'])) {
         $spec['args'] = isset($spec[1]) ? $spec[1] : [];
     }
     if (isset($spec['method'])) {
         $this->target = $this->{$spec['method']}();
         return;
     }
     if (is_string($spec['args'])) {
         $spec['args'] = $this->{$spec['args']}();
     }
     if (isset($spec['mock'])) {
         $this->target = $this->_setupTarget_setupMock($spec['class'], $spec['args'], $spec['mock']);
         return;
     }
     $this->target = InstanceCreator::newClass($spec['class'], $spec['args']);
 }
 /**
  * @testdox      Allows setting and/or getting object property values.
  * @dataProvider propertiesProvider
  */
 public function testSetterAndGetter($name, $spec)
 {
     $errTmpl = __METHOD__ . ': ' . get_class($this);
     if (!property_exists($this, 'target') || !is_object($this->target) && !isset($spec['target'])) {
         throw new \PHPUnit_Framework_Exception($errTmpl . ' must define the property "target" and the value must be an object.');
     }
     if (!is_array($spec)) {
         $spec = ['value' => $spec];
     }
     if (isset($spec['@value'])) {
         $spec['value'] = InstanceCreator::fromSpec($spec['@value'], InstanceCreator::FORCE_INSTANTIATION);
     }
     /* Value could be 'null', so we need to use array_key_exists here. */
     if (!array_key_exists('value', $spec)) {
         if (!array_key_exists('default', $spec)) {
             throw new \PHPUnit_Framework_Exception($errTmpl . ': Specification must contain the key "value" or "default".');
         }
         $spec['value'] = null;
         $spec['ignore_getter'] = true;
         $spec['ignore_setter'] = true;
     }
     if (isset($spec['target'])) {
         $this->target = is_object($spec['target']) ? $spec['target'] : InstanceCreator::fromSpec($spec['target'], InstanceCreator::FORCE_INSTANTIATION);
     }
     if (isset($spec['@default'])) {
         $spec['default'] = InstanceCreator::fromSpec($spec['@default'], InstanceCreator::FORCE_INSTANTIATION);
     } else {
         if (isset($spec['default@'])) {
             $spec['default'] = '@' . $spec['default@'];
         }
     }
     if (is_string($spec['value']) && 0 === strpos($spec['value'], '@')) {
         $spec['value'] = InstanceCreator::newClass($spec['value']);
     }
     $this->_setterGetter_triggerHook('pre', $spec);
     $getterMethod = isset($spec['getter_method']) ? str_replace('*', $name, $spec['getter_method']) : "get{$name}";
     $setterMethod = isset($spec['setter_method']) ? str_replace('*', $name, $spec['setter_method']) : "set{$name}";
     $getterArgs = isset($spec['getter_args']) ? $spec['getter_args'] : false;
     $setterArgs = isset($spec['setter_args']) ? $spec['setter_args'] : false;
     if (isset($spec['setter_exception'])) {
         $this->_setterGetter_assertSetterGetterException($setterMethod, $spec['setter_exception'], $spec['value'], $setterArgs);
         return;
     }
     if (isset($spec['default'])) {
         $defaultGetterArgs = isset($spec['default_args']) ? $spec['default_args'] : $getterArgs;
         $assert = isset($spec['default_assert']) ? $spec['default_assert'] : null;
         $this->_setterGetter_assertGetterValue($getterMethod, $spec['default'], $defaultGetterArgs, $assert, true);
     }
     if (!isset($spec['ignore_setter']) || !$spec['ignore_setter']) {
         $assert = isset($spec['setter_assert']) ? $spec['setter_assert'] : null;
         $this->_setterGetter_assertSetterValue($setterMethod, $spec['value'], $setterArgs, $assert, array_key_exists('setter_value', $spec) ? $spec['setter_value'] : '__FLUENT_INTERFACE__');
     }
     if (isset($spec['getter_exception'])) {
         $this->_setterGetter_assertSetterGetterException($getterMethod, $spec['getter_exception'], '__GETTER_EXCEPTION__', $getterArgs);
         return;
     }
     if (isset($spec['expect_property'])) {
         $assert = isset($spec['property_assert']) ? $spec['property_assert'] : null;
         $this->_setterGetter_assertPropertyValue($name, $spec['expect_property'], $assert);
     } else {
         if (!isset($spec['ignore_getter']) || !$spec['ignore_getter']) {
             $assert = isset($spec['getter_assert']) ? $spec['getter_assert'] : null;
             $this->_setterGetter_assertGetterValue($getterMethod, isset($spec['expect']) ? $spec['expect'] : $spec['value'], $getterArgs, $assert);
         }
     }
     $this->_setterGetter_triggerHook('post', $spec);
 }