# File lib/chronic/handler.rb, line 23
    def match(tokens, definitions)
      token_index = 0

      @pattern.each do |element|
        name = element.to_s
        optional = name[-1, 1] == '?'
        name = name.chop if optional

        case element
        when Symbol
          if tags_match?(name, tokens, token_index)
            token_index += 1
            next
          else
            if optional
              next
            else
              return false
            end
          end
        when String
          return true if optional && token_index == tokens.size

          if definitions.key?(name.to_sym)
            sub_handlers = definitions[name.to_sym]
          else
            raise ChronicPain, "Invalid subset #{name} specified"
          end

          sub_handlers.each do |sub_handler|
            return true if sub_handler.match(tokens[token_index..tokens.size], definitions)
          end
        else
          raise ChronicPain, "Invalid match type: #{element.class}"
        end
      end

      return false if token_index != tokens.size
      return true
    end