         if exists
           @login(fn)
         else
-          fn(false)
           @kick()
       .fail (err) =>
         log err
         @kick(err)
 
-  login: (callback) =>
+  ###
+   * (Private) User Login
+   *
+   * This handles logging in a user after they have been authenticated.
+   * It releases control of the Jandal instance and then creates a new
+   * UserSocket. If an error occurs, the socket will be closed.
+   *
+   * - fn (callback)
+  ###
+
+  login: (fn) =>
     socket = @_socket
     @release()
     Storage.get(@userId)
       .then (user) =>
         new UserSocket(socket, user)
-        callback(true)
+        fn(null, true)
       .fail (err) =>
         log err
         @kick(err)
 
+  ###
+   * (Private) Kick
+   *
+   * This will close a socket because authentication has failed.
+   *
+   * [message] (string) : Optional error message
+  ###
+
   kick: (message='err_bad_token') =>
     @close 3002, message
+
+
+  ###
+   * (Private) Timeout
+   *
+   * This will close a socket because no attempt was made to authenticate
+   * within the time limit.
+  ###
 
   timeout: =>
     @close 1002, 'err_auth_timeout'

  task_update: (model, time, fn) =>
    model = @sync.update TASK, model, time
    if model then @broadcast 'task.update', model
    if type.function(fn) then fn()

  list_update: (model, time, fn) =>
    model = @sync.update LIST, model, time
    if model then @broadcast 'list.update', model
    if type.function(fn) then fn()

  pref_update: (model, time, fn) =>
    model = @sync.update PREF, model, time
    if model then @broadcast 'pref.update', model
    if type.function(fn) then fn()


  ###

  task_destroy: (id, fn) =>
    @sync.destroy TASK, id
    @broadcast 'task.destroy', id
    if type.function(fn) then fn(null)

  list_destroy: (id, fn) =>
    @sync.destroy LIST, id
    @broadcast 'list.destroy', id
    if type.function(fn) then fn(null)


  ###
