           ret.push arg
       ret.push current_str unless current_str.length == 0
       ret
-    display: (force_string)->
+
+    levelAndEntryIndexString: ()->
+      "#{@level} (##{@index}):"
+
+    display: (force_string, @index)->
       if force_string
         [@createStrMsg()]
       else

    instrument: (opts)->
      __logger = @
      ->
        arr = Array.prototype.slice.call(arguments)
        arr.unshift(@)
        arr.unshift "#{opts.name} call: "
        __logger.add('instrumented', arr)
        retval = opts.fn.apply(@, arguments)
        __logger.add('instrumented', ["#{opts.name} return: ", retval])
        retval

  class_mixer Logger


ttm.define "logger", ['lib/class_mixer'], (class_mixer)->
  class LogEntry
    initialize: ((@level, @args)->)
    createStrMsg: (index)->
      message = ''
      for arg in @args
        arg = JSON.stringify(arg) unless typeof arg is 'string'
        message += "#{arg} "
      "#{@levelAndEntryIndexString()} #{message}"

    createArrMsg: (index)->
      ret = []
      current_str = @levelAndEntryIndexString()

      for arg in @args
        if typeof arg is 'string'
          current_str += " #{arg}"
