def match(uri, processor=nil)
uri = Addressable::URI.parse(uri)
mapping = {}
expansions, expansion_regexp =
parse_template_pattern(pattern, processor)
unparsed_values = uri.to_str.scan(expansion_regexp).flatten
if uri.to_str == pattern
return Addressable::Template::MatchData.new(uri, self, mapping)
elsif expansions.size > 0 && expansions.size == unparsed_values.size
expansions.each_with_index do |expansion, index|
unparsed_value = unparsed_values[index]
if expansion =~ OPERATOR_EXPANSION
operator, argument, variables =
parse_template_expansion(expansion)
extract_method = "extract_#{operator}_operator"
if ([extract_method, extract_method.to_sym] &
private_methods).empty?
raise InvalidTemplateOperatorError,
"Invalid template operator: #{operator}"
else
begin
send(
extract_method.to_sym, unparsed_value, processor,
argument, variables, mapping
)
rescue TemplateOperatorAbortedError
return nil
end
end
else
name = expansion[VARIABLE_EXPANSION, 1]
value = unparsed_value
if processor != nil && processor.respond_to?(:restore)
value = processor.restore(name, value)
end
if mapping[name] == nil || mapping[name] == value
mapping[name] = value
else
return nil
end
end
end
return Addressable::Template::MatchData.new(uri, self, mapping)
else
return nil
end
end