protected function replacePropertyExpression($matches) {
		//count available matches
		//this indicates the type of expression to replace
		$total_matches = count($matches);
		$type = $subindex = null;
	
		switch ($total_matches) {
			/*
			 * Property
			 */
			case 4: //#{PROPERTY@1[INDEX]@2?:TYPE@3}
				$type = substr($matches[3], 1);
			case 3: //#{PROPERTY@1[INDEX]@2}
				$subindex = empty($matches[2]) ? null : substr($matches[2], 1, -1);
			case 2: //#{PROPERTY@1}
				$key = $matches[1];

				//obtain type from annotation (when possible)
				if (is_null($type) && $this->wrappedArg instanceof ObjectArgumentWrapper) {
					if ($this->wrappedArg->getClassProfile()->isEntity()) {
						$property = $this->wrappedArg->getClassProfile()->getProperty($key);
						$type = $property->getType();
					}
				}
	
				return $this->getIndex($key, $subindex, $type);
				break;
	
			/*
			 * Interval
			 */
			case 9: //#{PROPERTY@4[LEFT_INDEX@6..RIGHT_INDEX@7]:TYPE@8}
				$type = substr($matches[8], 1);
			case 8: //#{PROPERTY@4[LEFT_INDEX@6..RIGHT_INDEX@7]}
				$key = $matches[4];
					
				//obtain type from annotation (when possible)
				if (is_null($type) && $this->wrappedArg instanceof ObjectArgumentWrapper) {
					if ($this->wrappedArg->getClassProfile()->isEntity()) {
						$property = $this->wrappedArg->getClassProfile()->getProperty($key);
						$type = $property->getType();
					}
				}
					
				return $this->getRange($key, $matches[6], $matches[7], $type);
				break;
		}
	}