docs: function Property (name, value, parent, metadata) {
  
          var myName = "/" + name;
          if (parent) {
              myName = parent.getName() + myName;
          }
  
          Object.defineProperty(this, "_name", {
              value: myName,
              enumerable: false
          });
  
          Object.defineProperty(this, "_parent", {
              value: parent,
              enumerable: false,
              writable: false,
              configurable: true //set to configurable so we can delete it in destroy
          });
  
          Object.defineProperty(this, "_metadata", {
              value: metadata || {},
              enumerable: false
          });
  
          Object.defineProperty(this, "_eventListeners", {
              value: { //map of eventName to listener array. The following are modeljs Events
                  propertyChange: [],
                  modelChange: [],
                  change: [],
                  childCreated: [],
                  childDestroyed: [],
                  destroy: [],
                  all: []
              },
              enumerable: false,
              writable: false,
              configurable: false
          });
  
          var myValue = value;
          if (isFunction(myValue)) {
              myValue = myValue.bind(parent);
          }
          //make sure value is valid
          if (!this.validateValue(myValue)) {
              myValue = undefined;
          }
  
          Object.defineProperty(this, "_myValue", {
              value: myValue,
              enumerable: false,
              writable: true
          });
      }