     warn err  if err
     @status = "fail"
     @emit "healthCheckCompleted"
+
+  recover: ->
+    @completeEvent = "recoveryCompleted"
+    @startCheck()
+    @emit "recoveryStarted"
+    {recover} = @getOptions()
+    recover @finish.bind(this)
+
+  canBeRecovered: ->
+    @getOptions().recover?
+

      @status = if speedCheck and @getResponseTime() > slownessIndicator then "slow" else "success"
      clearTimeout @pingTimeout
      @pingTimeout = null
      @emit "healthCheckCompleted"

  reset: ->
    @status = "waiting"


  run: ->
    @emit "healthCheckStarted"

    {troubleshoot} = @getOptions()
    return @forceComplete "undefined callback"  unless troubleshoot
    @completeEvent = "healthCheckCompleted"
    @startCheck()
    troubleshoot @finish.bind(this)

  setPingTimeout: ->
    @pingTimeout = setTimeout =>
      @status = "fail"
      @emit @completeEvent
    , @getOptions().timeout

  finish: (data)->
