class RSpec::Mocks::TargetBase

@private

def self.delegate_not_to(matcher_method, options = {})

def self.delegate_not_to(matcher_method, options = {})
  method_name = options.fetch(:from)
  define_method(method_name) do |matcher, &block|
    case matcher
    when Matchers::Receive
      define_matcher(matcher, matcher_method, &block)
    when Matchers::ReceiveMessages, Matchers::ReceiveMessageChain
      raise_negation_unsupported(method_name, matcher)
    else
      raise_unsupported_matcher(method_name, matcher)
    end
  end
end

def self.delegate_to(matcher_method)

def self.delegate_to(matcher_method)
  define_method(:to) do |matcher, &block|
    unless matcher_allowed?(matcher)
      raise_unsupported_matcher(:to, matcher)
    end
    define_matcher(matcher, matcher_method, &block)
  end
end

def self.disallow_negation(method_name)

def self.disallow_negation(method_name)
  define_method(method_name) do |matcher, *args|
    raise_negation_unsupported(method_name, matcher)
  end
end

def define_matcher(matcher, name, &block)

def define_matcher(matcher, name, &block)
  matcher.__send__(name, @target, &block)
end

def expression

def expression
  self.class::EXPRESSION
end

def initialize(target)

def initialize(target)
  @target = target
end

def matcher_allowed?(matcher)

def matcher_allowed?(matcher)
  matcher.class.name.start_with?("RSpec::Mocks::Matchers".freeze)
end

def raise_negation_unsupported(method_name, matcher)

def raise_negation_unsupported(method_name, matcher)
  raise NegationUnsupportedError,
    "`#{expression}(...).#{method_name} #{matcher.name}` is not supported since it " +
    "doesn't really make sense. What would it even mean?"
end

def raise_unsupported_matcher(method_name, matcher)

def raise_unsupported_matcher(method_name, matcher)
  raise UnsupportedMatcherError,
    "only the `receive` or `receive_messages` matchers are supported " +
    "with `#{expression}(...).#{method_name}`, but you have provided: #{matcher}"
end