   client.auth options.password if options.password?
   new Fairy client
 
-# ### Exception & Interruption Handling
+# ### Exception / Interruption Handling
 #
 # Use `uncaughtException` and `SIGINT` to provide elegant exception and user
 # interruption handling.

  #   + Arguments except the (optional) callback function will be serialized as
  #   a JSON array.
  #   + **The first argument will be served as the group identifier** to ensure
  #   sequential processing for all tasks of the same group (aka. first-come-
  #   first-serve). Current time is appended at the argument array for
  #   monitoring purpose.
  #
  # **Usage:**
  #
  #     queue.enqueue 'param1', 'param2', -> console.log 'queued!'
  #     queue.enqueue 'param1', 'param2'
  # 
  # A transaction ensures the atomicity.
  enqueue: (args..., callback) =>
    if typeof callback isnt 'function'
      args.push callback
      callback = undefined
    args.push Date.now()
    multi = @redis.multi()
    multi.rpush @key('SOURCE'), JSON.stringify([uuid.v4(), args...])
    multi.hincrby @key('STATISTICS'), 'total', 1
    multi.sadd @key('GROUPS'), args[0]
    multi.exec callback

  # ### Register Handler

  _try_exit: =>
    registered_workers.splice registered_workers.indexOf "#{@fairy.id}|#{@name}", 1
    process.exit() unless registered_workers.length
    log_registered_workers()

  # ### Process Each Group's First Task

