So this is a good take on the pattern we usually use in matchers... I'm not sure what I feel about the `||=` here though. I'm also sort of against instance variables being set in other methods like this because it hard to know what's going on. 

What if you had a method like this?

~~~ ruby
def submatch(message_key, &block)
  if block.call
    MESSAGES[message_key] % { subject: @subject.class }
  end
end
~~~

So then #matches? would end with:

~~~ ruby
@failure_message_for_should = 
  submatch(:authenticate_correct_password) { subject.authenticate(CORRECT_PASSWORD) } ||
  submatch(:authenticate_incorrect_password) { !subject.authenticate(INCORRECT_PASSWORD) }
@failure_message_for_should.nil?
~~~

There are also some issues with this -- #submatch needs a different name here because it's unclear what it actually does. However, this way it's purely functional and it's easy to see how @failure_message_for_should is set.

What do you think?