code: function createXYZPropType(Type, override = {}) {
      return {
          attribute: { source: true, target: false }, // get the value from an attribute (but don't mirror it back)
          coerce(val, propName) {
              // if we have a property function, pass it along as is
              if (typeof val === 'function') return val
  
              // if we're setting the same instance, use it as is
              if (val === this[propName]) return val
  
              // otherwise we process the input value into the XYZValues object
              return this[propName].from(val)
          },
          default(propName) { return this._props[propName] },
          deserialize(val, propName) { return this[propName].fromString(val) },
          serialize(val, propName) { this[propName].toString() },
          ...override,
      }
  }
docs: This helper is meant to be used to create prop types for props who's values are instances of XYZValues (or subclasses of XYZValues), general on Node and Behavior class hierarchies.