       @cachedContents = null
       @trigger "removed"
 
+  # Private:
   subscribeToNativeChangeEvents: ->
     @watchSubscription = pathWatcher.watch @path, (eventType, path) =>
       @handleNativeChangeEvent(eventType, path)
 
+  # Private:
   unsubscribeFromNativeChangeEvents: ->
     if @watchSubscription
       @watchSubscription.close()

    else
      @cachedContents

  # Checks to see if a file exists.
  #
  # Returns a {Boolean}.
  exists: ->
    fsUtils.exists(@getPath())

  ### Internal ###

  afterSubscribe: ->
    @subscribeToNativeChangeEvents() if @exists() and @subscriptionCount() == 1

  afterUnsubscribe: ->
    @unsubscribeFromNativeChangeEvents() if @subscriptionCount() == 0

  handleNativeChangeEvent: (eventType, path) ->
    if eventType is "delete"
      @unsubscribeFromNativeChangeEvents()

      return if oldContents == newContents
      @trigger 'contents-changed'

  # Private:
  detectResurrectionAfterDelay: ->
    _.delay (=> @detectResurrection()), 50

  # Private:
  detectResurrection: ->
    if @exists()
      @subscribeToNativeChangeEvents()
