         set: (name) -> object.rename name
       aliases:
         enumerable: true
-        get: -> (alias for alias in object.aliases)
+        get: ->
+          aliases = (alias for alias in object.aliases)
+
+          # makes a function which acts like an array mutator on the aliases array
+          # and then updates the objects underlying array
+          wam = (method) ->
+            ->
+              ret = [][method].apply aliases, arguments
+              object.updateAliases aliases
+              ret
+
+          aliases.pop = wam('pop')
+          aliases.push = wam('push')
+          aliases.reverse = wam('reverse')
+          aliases.shift = wam('shift')
+          aliases.sort = wam('sort')
+          aliases.splice = wam('splice')
+          aliases.unshift = wam('unshift')
+
+          aliases
         set: (aliases) -> object.updateAliases aliases
       location:
         enumerable: true

      contents:
        enumerable: true
        get: -> object.contents().map (o) -> context.contextify o
        set: -> throw new Error "No setter for 'contents_ids'"
      player:
        enumerable: true
        get: -> object.player

      programmer:
        enumerable: true
        get: -> object.programmer
        set: (programmer) ->
          if object.player
            object.setProgrammer programmer
          else
            throw new Error "Object is not a player"
    })

    addPropProp = (key) =>
      Object.defineProperty(@, key,
        enumerable: true
        configurable: true
        get: -> context.deserialize object.getProp key
        set: (val) -> object.setProp key, context.serialize val
      )

    rmPropProp = (key) =>
      delete @[key]

    for key of object.getAllProperties()
      addPropProp key

    addVerbProp = (verb) =>
      Object.defineProperty(@, verb.name,
        enumerable: true
        configurable: true
        get: ->
          fn = ->
            newContext = new VerbContext(
              context.player, object, context.context.dobj, context.context.iobj,
              verb.name, context.context.argstr, context.context.dobjstr, context.context.prepstr, context.context.iobjstr, context.memo)
            newContext.run verb.code, Array.prototype.slice.call(arguments)
          fn.verb = true
          fn
        set: -> throw new Error "No setter for verb"
      )

    rmVerbProp = (verbName) =>
      delete @[verbName]

    for verbName, verb of object.getAllVerbs()
      addVerbProp verb

    @addProp = (key, value) ->
      object.addProp key, context.serialize value
      addPropProp key

    @rmProp = (key) ->
      object.rmProp key
      rmPropProp key

    @editVerb = (verbName) ->
      object.editVerb context.player, verbName

    @addVerb = (verbName, dobjarg = 'none', preparg = 'none', iobjarg = 'none') ->
      object.addVerbPublic context.player, verbName, dobjarg, preparg, iobjarg

    @rmVerb = (verbName) ->
      object.rmVerb verbName
      rmVerbProp verbName

    @clone = (newName, newAliases = []) ->
      context.contextify db.clone(object, newName, newAliases)
