internal override bool TryMatch(
     ContentItem item,
     IDictionary<string, ContentPropertyDefinition> propertyDefinitions,
     int startIndex,
     out int endIndex)
 {
     if (item.Path.Length >= startIndex + _literal.Length)
     {
         var substring = item.Path.Substring(startIndex, _literal.Length);
         if (string.Equals(_literal, substring, StringComparison.OrdinalIgnoreCase))
         {
             endIndex = startIndex + _literal.Length;
             return true;
         }
     }
     endIndex = startIndex;
     return false;
 }
 public ContentItem Match(string path, IDictionary<string, ContentPropertyDefinition> propertyDefinitions)
 {
     var item = new ContentItem
     {
         Path = path
     };
     var startIndex = 0;
     foreach (var segment in _segments)
     {
         int endIndex;
         if (segment.TryMatch(item, propertyDefinitions, startIndex, out endIndex))
         {
             startIndex = endIndex;
             continue;
         }
         return null;
     }
     return startIndex == path.Length ? item : null;
 }
 internal abstract bool TryMatch(ContentItem item, IDictionary<string, ContentPropertyDefinition> propertyDefinitions, int startIndex, out int endIndex);
 internal override bool TryMatch(ContentItem item, IDictionary<string, ContentPropertyDefinition> propertyDefinitions, int startIndex, out int endIndex)
 {
     ContentPropertyDefinition propertyDefinition;
     if (!propertyDefinitions.TryGetValue(_token, out propertyDefinition))
     {
         throw new Exception(string.Format("Unable to find property definition for {{{0}}}", _token));
     }
     for (var scanIndex = startIndex; scanIndex != item.Path.Length;)
     {
         var delimiterIndex = (item.Path + _delimiter).IndexOf(_delimiter, scanIndex + 1);
         if (delimiterIndex == item.Path.Length && _delimiter != '\0')
         {
             break;
         }
         var substring = item.Path.Substring(startIndex, delimiterIndex - startIndex);
         object value;
         if (propertyDefinition.TryLookup(substring, out value))
         {
             if (!_matchOnly)
             {
                 item.Properties.Add(_token, value);
             }
             endIndex = delimiterIndex;
             return true;
         }
         scanIndex = delimiterIndex;
     }
     endIndex = startIndex;
     return false;
 }