code: function ObservableMembers(options = {}) {
      return function (classDescriptor) {
          if (!options.noMethods) {
              addMethodsToClassDescriptor(classDescriptor);
          }
  
          // Add props to the prototype
          if (isArray(options.props)) {
              classDescriptor.elements.push(
                  ...options.props.map(propName => getElementDescriptorForProp(propName))
              )
          }
  
          // Add computed to the prototype
          if (options.computed) {
              objectKeys(options.computed).forEach(
                  propName => classDescriptor.elements.push(getElementDescriptorForProp(propName, options.computed[propName]))
              );
          }
  
          return classDescriptor;
      }
  }
docs: Decorates a class with methods that allow it to watch observables as well
  as add instance members (fields) to the class of either regular observables
  or computed props.
  
  @param {Object} [options]
  
  @param {Array} [options.noMethods]
  If true, then class will not be decorated with the class methods (`$prop()`, `$on()`, `$assign`)
  
  @param {Array} [options.props]
  
  @param {Object} [options.computed]
  
  @returns {Function}
  
  @example
  
  @ObservableMembers({
  props: ["firstName", "lastName"],
  computed: {
  name() {
  return `${ this.firstName } ${ this.lastName }`;
  }
  }
  })
  class Model {}