code: function(options) {
    Entity.call(this, options);
  
    addCustomFeatureProperties(this);
    /**
     * Gets or sets the current properties. This property is observable.
     * @type {Object}
     */
    this.currentProperties = undefined;
  
    /**
     * Gets or sets the current description. This property is observable.
     * @type {String}
     */
    this.currentDescription = undefined;
  
    /**
     * Gets or sets counter objects used to trigger an update of the Feature Info Section,
     * to allow custom components to self-update. The object keys are timeoutIds, and values are
     * {reactComponent: ReactComponent, counter: Integer}.
     * This property is observable.
     * @type {Object}
     */
    this.updateCounters = undefined;
  
    // Do not add any Cesium-added properties (eg. description or properties) to this, because
    // they are added as getters and setters, which probably interferes with knockout's getters and setters.
    // Instead, subscribe to definitionChanged events.
    knockout.track(this, [
      "currentProperties",
      "currentDescription",
      "updateCounters"
    ]);
  }
docs: A feature is just a Cesium Entity, with observable (ie. knockout-tracked) properties added for
  currentDescription and currentProperties. These are tracked so that the feature info updates as the clock time changes,
  because the properties and description themselves do not change (they are functions of the time, whose values change).
  Set these if needed from an event listener on the terria clock, eg.
  terria.clock.onTick.addEventListener(function(clock) {
  if (typeof feature.description.getValue === 'function') {
  feature.currentDescription = feature.description.getValue(clock.currentTime);
  };
  if (typeof feature.properties.getValue === 'function') {
  feature.currentProperties = feature.properties.getValue(clock.currentTime);
  };
  });
  
  @alias Feature
  @constructor
  @param {Object} [options] Object with the same properties as Cesium's Entity.
  @extends Entity