     syncOptions.data.search = @loadOptions.search if @loadOptions.search
     syncOptions
 
+  ###*
+   * Called when the Backbone.sync successfully responds from the server.
+   * @param  {object} resp    JSON response from the server.
+   * @param  {string} _status
+   * @param  {object} _xhr    jQuery XHR object
+   * @return {undefined}
+  ###
   _onSyncSuccess: (resp, _status, _xhr) =>
     data = @_updateStorageManagerFromResponse(resp)
     @_onLoadSuccess(data)
 
-  _updateStorageManagerFromResponse: ->
-    throw "Implement in your subclass"
-
+  ###*
+   * Called when the server responds with data and needs to be persisted to the storageManager.
+   * @param  {object} resp JSON data from the server
+   * @return {[array|object]} array of models or model that was parsed.
+  ###
+  _updateStorageManagerFromResponse: (resp) ->
+    throw "Implement in your subclass"
+
+  ###*
+   * Updates the internalObject with the data in the storageManager and either loads more data or resolves this load.
+   * Called after sync + storage manager upadting.
+   * @param  {array|object} data array of models or model from _updateStorageManagerFromResponse
+   * @return {undefined}
+  ###
+  _onLoadSuccess: (data) ->
+    @_updateObjects(@internalObject, data)
+    @_calculateAdditionalIncludes()
+
+    if @additionalIncludes.length
+      @_loadAdditionalIncludes()
+    else
+      @_onLoadingCompleted()
+
+  ###*
+   * Called after the server responds with the first layer of includes to determine if any more loads are needed.
+   * It will only make additional loads if there were IDs returned during this load for a given association.
+   * @return {undefined}
+  ###
   _calculateAdditionalIncludes: ->
     @additionalIncludes = []
 

    else
      @_loadData()

  getCollectionName: ->
    throw "Implement in your subclass"

  _parseLoadOptions: (loadOptions = {}) ->
    @originalOptions = _.clone(loadOptions)
    @loadOptions = _.clone(loadOptions)

    @deferred = $.Deferred()
    @deferred.promise(this)

  ###*
   * Setup the loader with a list of Brainstem specific loadOptions
   * @param  {object} loadOptions Brainstem specific loadOptions (filters, include, only, etc)
   * @return {object} externalObject that was created.
  ###
  setup: (loadOptions) ->
    @_parseLoadOptions(loadOptions)
    @_createInternalObject()
