   # being executed.
   #
   # message - A Message instance.
-  #
-  # @callback - Call with a boolean of whether the matcher matched.
+  # callback - Optional function called with a boolean of whether the matcher matched
   #
   # Returns nothing
   # Returns before executing callback
   call: (message, cb) ->
-    throw new Error('missing callback') if not cb
-
     if match = @matcher message
       if @regex
         @robot.logger.debug \

      allDone = () ->
        # Yes, we tried to execute the listener callback (middleware may
        # have intercepted before actually executing though)
        process.nextTick -> cb true

      response = new @robot.Response(@robot, message, match)
      @robot.executeMiddleware 'listener',

        executeListener,
        allDone
    else
      if cb?
        # No, we didn't try to execute the listener callback
        process.nextTick -> cb false

class TextListener extends Listener
  # TextListeners receive every message from the chat source and decide if they
