   isEvent: true
   isEqual: (other) ->
     @constructor is other.constructor and @base is other.base and @key is other.key
+  hashKey: ->
+    @hashKey = -> key
+    key = "<Batman.Event base: #{Batman.Hash::hashKeyFor(@base)}, key: \"#{Batman.Hash::hashKeyFor(@key)}\">"
 
   addHandler: (handler) ->
     @handlers.add(handler)

    pairs.push([key, val])
    val
  unset: (key) ->
    if pairs = @_storage[key]
      for [obj,value], index in pairs
        if @equality(obj, key)
          pairs.splice(index,1)
          @length--
          return
  getOrSet: Batman.Observable.getOrSet
  equality: (lhs, rhs) ->
    return true if lhs is rhs
    return true if lhs isnt lhs and rhs isnt rhs # when both are NaN

  # Apply mixins to instances of this class.
  @mixin: -> @classMixin.apply @prototype, arguments
  mixin: @classMixin
  
  counter = 0
  _objectID: ->
    @_objectID = -> c
    c = counter++
  
  hashKey: ->
    return if typeof @isEqual is 'function'
    @hashKey = -> key
    key = "<Batman.Object #{@_objectID()}>"
  

  # Accessor implementation. Accessors are used to create properties on a class or prototype which can be fetched
  # with get, but are computed instead of just stored. This is a batman and old browser friendly version of
