       allDone = () ->
         # Yes, we tried to execute the listener callback (middleware may
         # have intercepted before actually executing though)
-        process.nextTick -> cb true
+        if cb?
+          process.nextTick -> cb true
 
       response = new @robot.Response(@robot, message, match)
       @robot.executeMiddleware 'listener',

        executeListener,
        allDone
    else
      # 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

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