class RSpec::Matchers::BuiltIn::BePredicate

def check_respond_to(method)

def check_respond_to(method)
  RSpec.deprecate(
    "Matching with #{@prefix}#{@expected} on an object that doesn't respond to `#{method}`",
    :replacement => "`respond_to_missing?` or `respond_to?` on your object"
  ) unless actual.respond_to?(method)
end

def description

def description
  "#{prefix_to_sentence}#{expected_to_sentence}#{args_to_sentence}"
end

def failure_message_for_should

def failure_message_for_should
  "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}"
end

def failure_message_for_should_not

def failure_message_for_should_not
  "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
end

def initialize(*args, &block)

def initialize(*args, &block)
  @expected = parse_expected(args.shift)
  @args = args
  @block = block
end

def is_private_on? actual

def is_private_on? actual
  actual.private_methods.include? predicate.to_s
end

def is_private_on? actual

def is_private_on? actual
  actual.private_methods.include? predicate
end

def matches?(actual)

def matches?(actual)
  @actual = actual
  if is_private_on?( @actual )
    RSpec.deprecate "matching with be_#{predicate.to_s.gsub(/\?$/,'')} on private method #{predicate}",
      :replacement => "`expect(object.send(#{predicate.inspect})).to be_true` or change the method's visibility to public",
      :call_site => caller(0)[3]
  end
  begin
    @result = actual.__send__(predicate, *@args, &@block)
    check_respond_to(predicate)
    return @result
  rescue NameError => predicate_missing_error
    "this needs to be here or rcov will not count this branch even though it's executed in a code example"
  end
  begin
    @result = actual.__send__(present_tense_predicate, *@args, &@block)
    check_respond_to(present_tense_predicate)
    return @result
  rescue NameError
    raise predicate_missing_error
  end
end

def parse_expected(expected)

def parse_expected(expected)
  @prefix, expected = prefix_and_expected(expected)
  expected
end

def predicate

def predicate
  "#{@expected}?".to_sym
end

def prefix_and_expected(symbol)

def prefix_and_expected(symbol)
  symbol.to_s =~ /^(be_(an?_)?)(.*)/
  return $1, $3
end

def prefix_to_sentence

def prefix_to_sentence
  split_words(@prefix)
end

def present_tense_predicate

def present_tense_predicate
  "#{@expected}s?".to_sym
end