private function resolveElementType(PropertyDefinition $property)
 {
     $type = $property->getType();
     if ($type instanceof ArrayType && null !== $type->getTypeOf()) {
         return $type->getTypeOf();
     }
     return null;
 }
 /**
  * @param PropertyDefinition $property
  * @return string[]
  */
 protected function resolvePropertyTypes(PropertyDefinition $property)
 {
     $types = [];
     $type = $property->getType();
     if ($type instanceof ArrayType) {
         $types[] = $this->getPhpDocArrayType($type);
         if ($property->hasDefaultValue() && $property->getDefaultValue() instanceof ArrayType) {
             return $types;
         }
     } else {
         $types[] = $property->getType()->getPhpTypeName();
     }
     if ($property->hasDefaultValue()) {
         $types[] = $property->getDefaultValue()->getPhpTypeName();
     } else {
         $types[] = 'null';
     }
     return array_unique($types);
 }
 /**
  * @param PropertyDefinition $property
  * @return $this
  */
 public function addProperty(PropertyDefinition $property)
 {
     if (method_exists($this, 'addClassNameUse')) {
         foreach ([$property->getDefaultValue(), $property->getType()] as $type) {
             if (true === $type instanceof ObjectType) {
                 /** @var $type ObjectType */
                 $this->addClassNameUse($type->getClassName());
             }
         }
     }
     $key = $property->getName()->toLowerCamelCase();
     $this->properties[$key] = $property;
     return $this;
 }
 /**
  * @param PropertyDefinition $property
  * @return MethodDefinition
  */
 protected function createSetMethod(PropertyDefinition $property)
 {
     $methodName = new PhpVariableName('set' . $property->getName()->toUpperCamelCase());
     $parameter = new ParameterDefinition($property->getType(), $property->getName(), new NullValue());
     $method = new MethodDefinition($methodName, [$parameter]);
     $method->setVisibility(Visibility::PUBLIC_VISIBILITY())->addLine(sprintf('$this->%1$s = $%1$s;', $property->getName()->toLowerCamelCase()));
     return $method;
 }
 private function resolveDoctrineTypeOfProperty(PropertyDefinition $property)
 {
     $map = [ObjectType::class => 'object', ArrayType::class => 'array', BooleanType::class => 'boolean', DateTimeType::class => 'datetime', DateType::class => 'date', FloatType::class => 'float', IntegerType::class => 'integer', JsonArrayType::class => 'json', StringType::class => 'text', TimeType::class => 'time'];
     $type = $property->getType();
     $resolvedType = $map[get_class($type)];
     if ($type instanceof StringType) {
         $definition = $property->getSourceConfiguration();
         if (true === array_key_exists('length', $definition)) {
             $resolvedType = 'string';
         }
     }
     return $resolvedType;
 }