you know you're redefining options here? I don't think that's a good idea.

Also, this method has too many responsibilities

1. options parsing
2.  branching with multiple returns

maybe you could refactor this to like

```ruby

        if expression_options = options.delete(:expression)
          extract_options(expression_options, options)
          return evaluate_tag_expression(tag_list, expression_options)
        elsif options.delete(:exclude)
#
# this
def evaluate_tag_expression(tag_list, options)
          result = self
          ActsAsTaggableOn::Expression::next_batch(tag_list[0], options) do |option, list|
            result = result.tagged_with(list, option => true)
          end

          result
end
def extract_options(local_options, global_options)
  if local_options.kind_of?(Hash)
    local_options
  else
    global_options
  end
end
```