protected function createPropertyImplementation($propertyName, $propertyOptions, ClassTypeImplementation $classImplementation)
 {
     $propertyImplementation = new PropertyImplementation($propertyName);
     $targetPropertyName = $propertyName;
     if (isset($propertyOptions['as'])) {
         $propertyImplementation->setTargetPropertyName($propertyOptions['as']);
         $targetPropertyName = $propertyOptions['as'];
     }
     // accessors enabled
     $accessorsEnabled = $classImplementation->isAccessorsEnabled();
     if (isset($propertyOptions['accessors']['enabled'])) {
         $accessorsEnabled = (bool) $propertyOptions['accessors']['enabled'];
     }
     // accessors names
     if (array_key_exists('setter', $propertyOptions)) {
         $propertyImplementation->setSetter($propertyOptions['setter']);
     } else {
         if ($accessorsEnabled) {
             $style = $classImplementation->getAccessorsStyle();
             if (!$style) {
                 $msg = 'Cannot generate setter name for property "' . $propertyName . '".
                             Define that name or naming style of setters and getters';
                 throw new \BadMethodCallException($msg);
             }
             $propertyImplementation->setSetter($style->generateSetterName($targetPropertyName));
         }
     }
     if (array_key_exists('getter', $propertyOptions)) {
         $propertyImplementation->setGetter($propertyOptions['getter']);
     } elseif ($accessorsEnabled) {
         $style = $classImplementation->getAccessorsStyle();
         if (!$style) {
             $msg = 'Cannot generate getter name for property "' . $propertyName . '".
                             Define that name or naming style of setters and getters';
             throw new \BadMethodCallException($msg);
         }
         $propertyImplementation->setGetter($style->generateGetterName($targetPropertyName));
     }
     return $propertyImplementation;
 }