           ids: associationIds
           include: associationInclude
 
-  _onLoadSuccess: (data) ->
-    @_updateObjects(@internalObject, data)
-    @_calculateAdditionalIncludes()
-
-    if @additionalIncludes.length
-      @_loadAdditionalIncludes()
-    else
-      @_onLoadingCompleted()
-
+  ###*
+   * Called when all loading (including nested loads) are complete.
+   * Updates the `externalObject` with the data that was gathered and resolves the promise.
+   * @return {[type]} [description]
+  ###
   _onLoadingCompleted: =>
     @_updateObjects(@externalObject, @internalObject)
     @deferred.resolve(@externalObject)
 
-  _updateObjects: ->
-    throw "Implement in your subclass"
-
+  ###*
+   * Updates the object with the supplied data. Will be called:
+   *   + after the server responds, `object` will be `internalObject` and data will be the result of `_updateStorageManagerFromResponse`
+   *   + after all loading is complete, `object` will be the `externalObject` and data will be the `internalObject`
+   * @param  {object} object object that will receive the data
+   * @param  {object} data data that needs set on the object
+   * @return {undefined}
+  ###
+  _updateObjects: (object, data) ->
+    throw "Implement in your subclass"
+
+  ###*
+   * Loads the next layer of includes from the server.
+   * When all loads are complete, it will call `_onLoadingCompleted` which will resolve this layer.
+   * @return {undefined}
+  ###
   _loadAdditionalIncludes: ->
     promises = []
 


    @externalObject

  _shouldUseOnly: ->
    @internalObject instanceof Backbone.Collection

  _buildSyncOptions: ->
    syncOptions =
      data: {}


    @externalObject

  ###*
   * Loads the model from memory or the server.
   * @return {object} the loader's `externalObject`
  ###
  load: ->
    if not @loadOptions
      throw "You must call #setup first or pass loadOptions into the constructor"
