       programmer:
         enumerable: true
         get: -> object.programmer
-        set: -> throw new Error "No setter for 'programmer'"
-      properties:
-        enumerable: true
-        get: -> mooUtil.hmap object.getAllProperties(), context.deserialize
-        set: -> throw new Error "No setter for 'properties'"
-      verbs:
-        enumerable: true
+        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: ->
-          verbs = {}
-          for verbName, verb of object.getAllVerbs()
-            do (verb) =>
-              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
-              verbs[verb.name] = fn
-          verbs
-        set: -> throw new Error "No setter for 'verbs'"
-    })
+          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
-
-    @getProp = (key) ->
-      context.deserialize object.getProp key
-
-    @setProp = (key, value) ->
-      object.setProp key, context.serialize value
-
-    @editVerb = (verb) ->
-      object.editVerb context.player, verb
+      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 = (verb) ->
-      object.rmVerb verb
+    @rmVerb = (verbName) ->
+      object.rmVerb verbName
+      rmVerbProp verbName
 
     @clone = (newName, newAliases = []) ->
       context.contextify db.clone(object, newName, newAliases)

        set: (name) -> object.rename name
      aliases:
        enumerable: true
        get: -> (alias for alias in object.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'"
      player:
        enumerable: true
        get: -> object.player
