def raise type = nil, message = nil, &block
      failure = Tokyo.__send__(
        @assert ? :assert_raised_as_expected : :refute_raised_as_expected,
        @object, type, message, block
      )
      Tokyo.fail(failure, caller[0]) if failure
    end
def raise type = nil, message = nil, &block
      failure = Tokyo.__send__(
        @assert ? :assert_raised_as_expected : :refute_raised_as_expected,
        @object, type, message, block
      )
      Tokyo.fail(failure, caller[0]) if failure
    end
ensure the given block raises as expected

 @note if block given it will have precedence over arguments

 @example assertion pass if block raises whatever
   assert {some code}.raise

 @example assertion pass if block raises NameError
   assert {some code}.raise NameError

 @example assertion pass if block raises NameError and error message matches /blah/
   assert {some code}.raise NameError, /blah/

 @example assertion pass if block raises whatever error that matches /blah/
   assert {some code}.raise nil, /blah/

 @example assertion pass if validation block returns a positive value
   assert {some code}.raise {|e| e.is_a?(NameError) && e.message =~ /blah/}


 @example assertion pass if nothing raised
   refute {some code}.raise
   # same
   fail_if {some code}.raise

 @example assertion fails only if block raises a NameError.
   it may raise whatever but NameError. if nothing raised assertion will fail.

   fail_if {some code}.raise NameError

 @example assertion pass if raised error does not match /blah/
   if nothing raised assertion will fail.

   fail_if {some code}.raise nil, /blah/

 @example assertion will pass if raised error is not a NameError
   and error message does not match /blah/
   if nothing raised assertion will fail as well.

   fail_if {some code}.raise NameError, /blah/