protected function parseProperties() {
		if ($this->isEntity()) {
			//property mapping
			$this->propertyMap = [];
			//associations
			$this->foreignkeys = $this->references = [];
			//read-only properties
			$this->readOnlyProperties = [];
			//duplicate checks
			$this->duplicateChecks = [];
		}
		
		$properties = $this->reflectionClass->getProperties();
		
		foreach ($properties as $reflectionProperty) {
			$propertyName = $reflectionProperty->getName();
			$propertyAnnotations = Omocha::getAnnotations($reflectionProperty);
			
			if (($this->isEntity() || $this->isResultMap()) && $this->isDynamicAttribute($propertyAnnotations))
				$this->parseDynamicAttribute($propertyName, $reflectionProperty, $propertyAnnotations);
			elseif ($this->isEntity() && $this->isAssociation($propertyAnnotations))
				$this->parseAssociation($propertyName, $reflectionProperty, $propertyAnnotations);
			else {
				$property = new ClassProperty($propertyName, $reflectionProperty, $propertyAnnotations);
				
				if ($this->isEntity()) {
					if ($property->isPrimaryKey())
						$this->primaryKey = $propertyName;
					elseif ($property->checksForDuplicates())
						$this->duplicateChecks[] = $propertyName;
						
					$this->propertyMap[$propertyName] = $property->getColumn();
					
					if ($property->isReadOnly())
						$this->readOnlyProperties[] = $propertyName;
				}
				
				$this->properties[$propertyName] = $property;
			}
		}
	}