class RSpec::Mocks::BaseExpectation

def and_raise(exception=Exception)

instance and not the class.
class initializer requires any parameters, you must pass in an
raise an instance of it, creating it with +new+. If the exception
When you pass an exception class, the MessageExpectation will

== Warning

and_raise(exception) #any exception object
and_raise(Exception) #any exception class
and_raise()
:call-seq:
def and_raise(exception=Exception)
  @exception_to_raise = exception
end

def and_return(*values, &return_block)

def and_return(*values, &return_block)
  Kernel::raise AmbiguousReturnError unless @method_block.nil?
  case values.size
    when 0 then value = nil
    when 1 then value = values[0]
  else
    value = values
    @consecutive = true
    @expected_received_count = values.size if !ignoring_args? &&
                                              @expected_received_count < values.size
  end
  @return_block = block_given? ? return_block : lambda { value }
end

def and_throw(symbol)

def and_throw(symbol)
  @symbol_to_throw = symbol
end

def and_yield(*args, &block)

def and_yield(*args, &block)
  if @args_to_yield_were_cloned
    @args_to_yield.clear
    @args_to_yield_were_cloned = false
  end
  
  if block
    @eval_context = Object.new
    @eval_context.extend RSpec::Mocks::InstanceExec
    yield @eval_context
  end
  
  @args_to_yield << args
  self
end

def build_child(expected_from, method_block, expected_received_count, opts={})

def build_child(expected_from, method_block, expected_received_count, opts={})
  child = clone
  child.expected_from = expected_from
  child.method_block = method_block
  child.expected_received_count = expected_received_count
  child.clear_actual_received_count!
  new_gen = error_generator.clone
  new_gen.opts = opts
  child.error_generator = new_gen
  child.clone_args_to_yield(*@args_to_yield)
  child
end

def called_max_times?

def called_max_times?
  @expected_received_count != :any && @expected_received_count > 0 &&
    @actual_received_count >= @expected_received_count
end

def clone_args_to_yield(*args)

def clone_args_to_yield(*args)
  @args_to_yield = args.clone
  @args_to_yield_were_cloned = true
end

def eval_block(*args, &block)

def eval_block(*args, &block)
  if @eval_context
    @eval_context.instance_exec(*args, &block)
  else
    block.call(*args)
  end
end

def expected_args

def expected_args
  @args_expectation.args
end

def failed_fast?

def failed_fast?
  @failed_fast
end

def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation)

def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation)
  @error_generator = error_generator
  @error_generator.opts = opts
  @expected_from = expected_from
  @sym = sym
  @method_block = method_block
  @return_block = nil
  @actual_received_count = 0
  @expected_received_count = expected_received_count
  @args_expectation = ArgumentExpectation.new(ArgumentMatchers::AnyArgsMatcher.new)
  @consecutive = false
  @exception_to_raise = nil
  @symbol_to_throw = nil
  @order_group = expectation_ordering
  @at_least = nil
  @at_most = nil
  @exactly = nil
  @args_to_yield = []
  @failed_fast = nil
  @args_to_yield_were_cloned = false
  @return_block = implementation
  @eval_context = nil
end

def invoke(*args, &block)

def invoke(*args, &block)
  if @expected_received_count == 0
    @failed_fast = true
    @actual_received_count += 1
    @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *args)
  end
  
  @order_group.handle_order_constraint self
  begin
    Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
    Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
    
    default_return_val = if !@method_block.nil?
                           invoke_method_block(*args, &block)
                         elsif !@args_to_yield.empty? || @eval_context
                           invoke_with_yield(&block)
                         else
                           nil
                         end
    
    if @consecutive
      invoke_consecutive_return_block(*args, &block)
    elsif @return_block
      invoke_return_block(*args, &block)
    else
      default_return_val
    end
  ensure
    @actual_received_count += 1
  end
end

def invoke_consecutive_return_block(*args, &block)

def invoke_consecutive_return_block(*args, &block)
  value = invoke_return_block(*args, &block)
  index = [@actual_received_count, value.size-1].min
  value[index]
end

def invoke_method_block(*args, &block)

def invoke_method_block(*args, &block)
  begin
    @method_block.call(*args, &block)
  rescue => detail
    @error_generator.raise_block_failed_error(@sym, detail.message)
  end
end

def invoke_return_block(*args, &block)

def invoke_return_block(*args, &block)
  args << block unless block.nil?
  # Ruby 1.9 - when we set @return_block to return values
  # regardless of arguments, any arguments will result in
  # a "wrong number of arguments" error
  @return_block.arity == 0 ? @return_block.call : @return_block.call(*args)
end

def invoke_with_yield(&block)

def invoke_with_yield(&block)
  if block.nil?
    @error_generator.raise_missing_block_error @args_to_yield
  end
  value = nil
  @args_to_yield.each do |args_to_yield_this_time|
    if block.arity > -1 && args_to_yield_this_time.length != block.arity
      @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
    end
    value = eval_block(*args_to_yield_this_time, &block)
  end
  value
end

def matches?(sym, *args)

def matches?(sym, *args)
  @sym == sym and @args_expectation.args_match?(*args)
end