Skip to content

Instantly share code, notes, and snippets.

@LTe
Created January 31, 2012 16:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LTe/1711333 to your computer and use it in GitHub Desktop.
Save LTe/1711333 to your computer and use it in GitHub Desktop.
module RSpec
module Matchers
module Extensions
module InstanceEvalWithArgs
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
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment