class Shoulda::Matchers::Independent::DelegateMatcher

def add_clarifications_to(message)

def add_clarifications_to(message)
  if @delegated_arguments.present?
    message << " with arguments: #{@delegated_arguments.inspect}"
  end
  if @method_on_target.present?
    message << " as :#{@method_on_target}"
  end
  message
end

def as(method_on_target)

def as(method_on_target)
  @method_on_target = method_on_target
  self
end

def delegating_method_name

def delegating_method_name
  method_name_with_class(@delegating_method)
end

def does_not_match?(subject)

def does_not_match?(subject)
  raise InvalidDelegateMatcher
end

def ensure_target_method_is_present!

def ensure_target_method_is_present!
  if @target_method.blank?
    raise TargetNotDefinedError
  end
end

def failure_message

def failure_message
  base = "Expected #{delegating_method_name} to delegate to #{target_method_name}"
  add_clarifications_to(base)
end

def initialize(delegating_method)

def initialize(delegating_method)
  @delegating_method = delegating_method
end

def matches?(subject)

def matches?(subject)
  @subject = subject
  ensure_target_method_is_present!
  begin
    extend Mocha::API
    stubbed_object = stub(method_on_target)
    subject.stubs(@target_method).returns(stubbed_object)
    subject.send(@delegating_method)
    stubbed_object.should have_received(method_on_target).with(*@delegated_arguments)
  rescue NoMethodError, RSpec::Expectations::ExpectationNotMetError, Mocha::ExpectationError
    false
  end
end

def method_name_with_class(method)

def method_name_with_class(method)
  if Class === @subject
    @subject.name + '.' + method.to_s
  else
    @subject.class.name + '#' + method.to_s
  end
end

def method_on_target

def method_on_target
  @method_on_target || @delegating_method
end

def target_method_name

def target_method_name
  method_name_with_class(@target_method)
end

def to(target_method)

def to(target_method)
  @target_method = target_method
  self
end

def with_arguments(*arguments)

def with_arguments(*arguments)
  @delegated_arguments = arguments
  self
end