def matches?(given_proc)
begin
if @expected_symbol.nil?
given_proc.call
else
@caught_arg = catch :proc_did_not_throw_anything do
catch @expected_symbol do
given_proc.call
throw :proc_did_not_throw_anything, :nothing_thrown
end
end
if @caught_arg == :nothing_thrown
@caught_arg = nil
else
@caught_symbol = @expected_symbol
end
end
rescue NameError, ArgumentError => e
unless e.message =~ %runcaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
other_exception = e
raise
end
@caught_symbol = $2.to_sym
rescue => other_exception
raise
ensure
unless other_exception
if @expected_symbol.nil?
return !@caught_symbol.nil?
else
if @expected_arg.nil?
return @caught_symbol == @expected_symbol
else
return (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
end
end
end
end
end