   isEnabled: ->
     enabled
 
-  extra: {}
   enableExtra: (tag) ->
     console.assert tag, 'Are you kidding me? What do you want to enable?'
     return (Debug.wrap 'Nothing happened') if !tag

################################################################################
#                                Debug Support                                 #
################################################################################

# This class is only for the purpose of giving some feedbacks

  getAllExtraOptionsAsArray: ->
    Array.from extraOpts
  _addExOptHandler: (tag) ->
    if !@extra[tag]?
      Object.defineProperty @extra, tag,
        value: new ExOptHandler
        enumerable: true
      Object.defineProperties @extra[tag],
        enable:
          value: @enableExtra.bind(@, tag)
        disable:
          value: @disableExtra.bind(@, tag)
        isEnabled:
          value: @isExtraEnabled.bind(@, tag)
        _log:
          value: @_log
        name:
          value: tag
          enumerable: true
        enabled:
          get: -> @isEnabled()
          set: (b) -> if b is true then @enable() else @disable()
          enumerable: true
        toString:
          value: -> "[#{tag}: #{if @isEnabled() then 'enabled' else 'disabled'}]"

  _log: doNothing
  Object.defineProperties @prototype,
    log:
      get: -> if @isEnabled() then @_log else doNothing
    extra:
      value: new ExtraDebugOptions
      enumerable: true

  init: ->
    @log "Debug Mode"
