docs: function defineProxy(object, stack) {
      if (! stack) stack = [];
  
      /* Non-null, non-array objects will be defined recursively */
      if (object &&
          ((typeof(object) === 'object') || (typeof(object) === 'function')) &&
          (!Array.isArray(object))) {
  
        /* Just triple check */
        if (stack.indexOf(object) >= 0) {
          throw new TypeError("Unable to proxy object: circular reference detected");
        }
  
        /* Definition, and functions are invokable */
        var definition = {};
        if (typeof(object) === 'function') definition["!$invocable$!"] = true;
  
        /* Recursively define this object */
        stack.push(object);
        for (var i in object) {
          definition[i] = defineProxy(object[i], stack);
        }
        stack.pop();
        return definition;
  
      }
  
      /* Everything else is just a getter */
      return { "!$value$!": object };
    }