docs: function propertySort(itemsKey, sortPropertiesKey) {
      var cp = new _emberMetalComputed.ComputedProperty(function (key) {
        var _this5 = this;
  
        var itemsKeyIsAtThis = itemsKey === '@this';
        var sortProperties = _emberMetalProperty_get.get(this, sortPropertiesKey);
  
        _emberMetalDebug.assert('The sort definition for \'' + key + '\' on ' + this + ' must be a function or an array of strings', _emberRuntimeUtils.isArray(sortProperties) && sortProperties.every(function (s) {
          return typeof s === 'string';
        }));
  
        var normalizedSortProperties = normalizeSortProperties(sortProperties);
  
        // Add/remove property observers as required.
        var activeObserversMap = cp._activeObserverMap || (cp._activeObserverMap = new _emberMetalWeak_map.default());
        var activeObservers = activeObserversMap.get(this);
  
        if (activeObservers) {
          activeObservers.forEach(function (args) {
            _emberMetalObserver.removeObserver.apply(null, args);
          });
        }
  
        function sortPropertyDidChange() {
          this.notifyPropertyChange(key);
        }
  
        activeObservers = normalizedSortProperties.map(function (_ref) {
          var prop = _ref[0];
  
          var path = itemsKeyIsAtThis ? '@each.' + prop : itemsKey + '.@each.' + prop;
          var args = [_this5, path, sortPropertyDidChange];
          _emberMetalObserver.addObserver.apply(null, args);
          return args;
        });
  
        activeObserversMap.set(this, activeObservers);
  
        // Sort and return the array.
        var items = itemsKeyIsAtThis ? this : _emberMetalProperty_get.get(this, itemsKey);
  
        if (_emberRuntimeUtils.isArray(items)) {
          return sortByNormalizedSortProperties(items, normalizedSortProperties);
        } else {
          return _emberRuntimeSystemNative_array.A();
        }
      });
  
      cp._activeObserverMap = undefined;
  
      return cp.property(sortPropertiesKey + '.[]').readOnly();
    }