   unshift: (item) -> @insertAt(0, item)
   shift: -> @deleteAt(0)
   update: (list) ->
-    @_notIn(element) for element in @
+    unmark(@, element) for element in @
     delete @[index] for index, _ of @ when isArrayIndex(index)
     @[index] = val for val, index in list
-    @_in(element) for element in list
+    mark(@, element) for element in list
     @trigger("update", list)
     @trigger("change", @)
     list
   splice: (start, deleteCount, list...) ->
-    @_in(element) for item in list
+    mark(@, element) for item in list
     deleted = Array.prototype.splice.apply(@, [start, deleteCount, list...])
-    @_notIn(element) for element in deleted
+    unmark(@, element) for element in deleted
     @trigger("update", list)
     @trigger("change", @)
     new Collection(deleted)

    @bind "change", => @length = getLength(@)
  get: (index) -> @[index]
  set: (index, value) ->
    @_notIn(@[index])
    @[index] = value
    @_in(value)
    @trigger("change:#{index}", value)
    @trigger("set", index, value)
    @trigger("change", @)
    value
  push: (element) ->
    @[@length] = element
    @_in(element)
    @trigger("add", element)
    @trigger("change", @)
    element

  find: (fun) ->
    return item for item in @ when fun(item)
  insertAt: (index, value) ->
    mark(@, value)
    Array.prototype.splice.call(@, index, 0, value)
    @trigger("insert", index, value)
    @trigger("change", @)
    value
  deleteAt: (index) ->
    value = @[index]
    unmark(@, value)
    Array.prototype.splice.call(@, index, 1)
    @trigger("delete", index, value)
    @trigger("change", @)
