     @documentReaders = []
     @documentPollers = []
 
-    @observer = new MutationObserver(@performDocumentPoll)
+    @observer = new MutationObserver(@requestDocumentPoll)
+    @debouncedPerformDocumentPoll = _.throttle(@performDocumentPoll, @minimumPollInterval).bind(this)
 
   # Essential: Add a provider that will be used to construct views in the
   # workspace's view layer based on model objects in its model layer.

    writer() while writer = @documentWriters.shift()

  startPollingDocument: ->
    window.addEventListener('resize', @performDocumentPoll)
    @observer.observe(document, {subtree: true, childList: true, attributes: true})

  stopPollingDocument: ->
    window.removeEventListener('resize', @performDocumentPoll)
    @observer.disconnect()

  performDocumentPoll: =>
    if @documentUpdateRequested
      @performDocumentPollAfterUpdate = true
    else
      poller() for poller in @documentPollers
      return

  documentUpdateRequested: false
  documentReadInProgress: false
  performDocumentPollAfterUpdate: false
  debouncedPerformDocumentPoll: null
  minimumPollInterval: 200

  constructor: ->
    @views = new WeakMap
