Module: RSpec::Matchers::Extensions::InstanceEvalWithArgs

Included in:
DSL::Matcher
Defined in:
lib/rspec/matchers/extensions/instance_eval_with_args.rb

Instance Method Summary (collapse)

Instance Method Details

- (Object) instance_eval_with_args(*args)

based on Bounded Spec InstanceExec (Mauricio Fernandez) http://eigenclass.org/hiki/bounded+space+instance_exec - uses singleton_class instead of global InstanceExecHelper module - this keeps it scoped to classes/modules that include this module - only necessary for ruby 1.8.6



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/rspec/matchers/extensions/instance_eval_with_args.rb', line 10

def instance_eval_with_args(*args, &block)
  return instance_exec(*args, &block) if respond_to?(:instance_exec)

  # If there are no args and the block doesn't expect any, there's no
  # need to fake instance_exec with our hack below.
  # Notes:
  #   * lambda { }.arity # => -1
  #   * lambda { || }.arity # => 0
  #   * lambda { |*a| }.arity # -1
  return instance_eval(&block) if block.arity < 1 && args.empty?

  singleton_class = (class << self; self; end)
  begin
    orig_critical, Thread.critical = Thread.critical, true
    n = 0
    n += 1 while respond_to?(method_name="__instance_exec#{n}")
    singleton_class.module_eval{ define_method(method_name, &block) }
  ensure
    Thread.critical = orig_critical
  end
  begin
    return __send__(method_name, *args)
  ensure
    singleton_class.module_eval{ remove_method(method_name) } rescue nil
  end
end