   check: (testedCheck) ->
     debug.property testedCheck, 'finish'
     debug.property testedCheck, 'state'
-    debug.property testedCheck.state, 'strategy'
+    debug.property testedCheck.state, 'strategy', (value)->
+      debug.call { strategy: value }, 'strategy'
     debug.property testedCheck.state, 'result'
     debug.property testedCheck.state, 'current'
-    debug.call testedCheck.state.done, 'push'
+    debug.call testedCheck.state.done, 'push', 'done.'
     testedCheck.push = debug.decorate testedCheck.push, (originalPush)->
-      originalPush.call testedCheck
-      debug.property testedCheck.state, 'strategy'
+      stack += "|"
+      indent = indent.substr 1
+      retVal = originalPush.call testedCheck
+      debug.property testedCheck.state, 'strategy', (value)->
+        debug.call { strategy: value }, 'strategy', '#', "[#{value.name}]"
       debug.property testedCheck.state, 'result'
       debug.property testedCheck.state, 'current'
-      debug.call testedCheck.state.done, 'push'
+      debug.call testedCheck.state.done, 'push', 'done.'
+      retVal
+    testedCheck.pop = debug.decorate testedCheck.pop, (originalPop)->
+      indent += " "
+      stack = stack.substr 1
+      originalPop.call testedCheck
     testedCheck.add = debug.decorate testedCheck.add, (originalAdd, args...)->
       try
         originalAdd.call testedCheck, args...

Function.prototype.toJSON = -> @name

debug = {
  call: (instance, key)->
    method = instance[key]
    instance[key] = (args...) ->
      console.log "call #{key}(#{args.map(JSON.stringify).join(',')})"
      method.call instance, args...

  property: (instance, key)->
    value = instance[key]
    Object.defineProperty instance, key,
      get: ->
        value
      set: (arg)->
        console.log "set #{key}: #{JSON.stringify arg}"
        value = arg
      enumerable: true,
      configurable: true,


        throw e

    debug.call testedCheck, 'add'
    debug.call testedCheck, 'assert'
    testedCheck
}
