   $extendsEnumerable(@::)
   propertyClass: Batman.Property
   hasKey: (key) ->
-    if pairs = @_storage[key]
+    if pairs = @_storage[@hashKeyFor(key)]
       for pair in pairs
         return true if @equality(pair[0], key)
     return false
   get: (key) ->
-    if pairs = @_storage[key]
+    if pairs = @_storage[@hashKeyFor(key)]
       for pair in pairs
         return pair[1] if @equality(pair[0], key)
   set: (key, val) ->
-    pairs = @_storage[key] ||= []
+    pairs = @_storage[@hashKeyFor(key)] ||= []
     for pair in pairs
       if @equality(pair[0], key)
         return pair[1] = val


  clear: @mutation(Batman.SimpleHash::clear)
  equality: Batman.SimpleHash::equality

  for k in ['hasKey', 'forEach', 'isEmpty', 'keys', 'merge']
    proto = @prototype

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