   # are encoded as surrogate pairs.
   #
   # Returns a {Boolean}.
-  hasAstral: -> @buffer.hasAstral()
+  hasAstral: ->
+    if @cachedHasAstral isnt null
+      @cachedHasAstral
+    else
+      @cachedHasAstral = @buffer.hasAstral()
+      @cachedHasAstral
 
   ###
   Section: Mutating Text

    @nextMarkerId = 1
    @outstandingSaveCount = 0
    @loadCount = 0
    @_emittedWillChangeEvent = false

    @setEncoding(params?.encoding)

      @_emittedWillChangeEvent = true

  emitDidChangeTextEvent: ->
    @cachedHasAstral = null
    if @transactCallDepth is 0
      if @changesSinceLastDidChangeTextEvent.length > 0
        compactedChanges = patchFromChanges(@changesSinceLastDidChangeTextEvent).getChanges()
