 
     EmitterMixin::on.apply(this, arguments)
 
+  ###
+  Section: Metadata
+  ###
+
+  # Public: Determine whether the buffer is empty.
+  #
+  # Returns a {Boolean}.
+  isEmpty: ->
+    @getLastRow() is 0 and @lineLengthForRow(0) is 0
+
+  # Public: Determine if the in-memory contents of the buffer differ from its
+  # contents on disk.
+  #
+  # If the buffer is unsaved, always returns `true` unless the buffer is empty.
+  #
+  # Returns a {Boolean}.
+  isModified: ->
+    return false unless @loaded
+    if @file
+      if @file.exists()
+        @getText() != @cachedDiskContents
+      else
+        @wasModifiedBeforeRemove ? not @isEmpty()
+    else
+      not @isEmpty()
+
+  # Public: Determine if the in-memory contents of the buffer conflict with the
+  # on-disk contents of its associated file.
+  #
+  # Returns a {Boolean}.
+  isInConflict: -> @conflict
+
+  # Public: Get the number of milliseconds that will elapse without a change
+  # before {::onDidStopChanging} observers are invoked following a change.
+  #
+  # Returns a {Number}.
+  getStoppedChangingDelay: -> @stoppedChangingDelay
+
+  ###
+  Section: Path Data
+  ###
+
+  # Pubilc: Get the path of the associated file.
+  #
+  # Returns a {String}.
+  getPath: ->
+    @file?.getPath()
+
+  # Public: Set the path for the buffer's associated file.
+  #
+  # * `filePath` A {String} representing the new file path
+  setPath: (filePath) ->
+    return if filePath == @getPath()
+
+    if filePath
+      @file = new File(filePath)
+      @subscribeToFile()
+    else
+      @file = null
+
+    @emit "path-changed", this
+    @emitter.emit 'did-change-path', @getPath()
+
+  # Public: Get the path of the associated file.
+  #
+  # Returns a {String}.
+  getUri: ->
+    @getPath()
+
+  # Get the basename of the associated file.
+  #
+  # The basename is the name portion of the file's path, without the containing
+  # directories.
+  #
+  # Returns a {String}.
+  getBaseName: ->
+    @file?.getBaseName()
+
+  ###
+  Section: Reading Text
+  ###
+
   # Public: Get the entire text of the buffer.
   #
   # Returns a {String}.

  refcount: 0
  fileSubscriptions: null

  # Public: Create a new buffer with the given params.
  #
  # * `params` A {String} of text or an {Object} with the following keys:
  #   * `load` A {Boolean}, `true` to asynchronously load the buffer from disk
  #     after initialization.
  #   * `text` The initial {String} text of the buffer.

  # Returns a {Marker}.
  markPosition: (position, properties) -> @markers.markPosition(position, properties)

  # Public: Get all existing markers on the buffer.
  #
  # Returns an {Array} of {Marker}s.
  getMarkers: -> @markers.getMarkers()

  # Public: Get an existing marker by its id.
  #
  # * `id` {Number} id of the marker to retrieve
  #
  # Returns a {Marker}.
  getMarker: (id) -> @markers.getMarker(id)

  # Public: Find markers conforming to the given parameters.
  #
