code: function DataStore(config) {
    if (!config) {
      throw new Error('config argument is required.');
    }
    this.requestExecutor = config.requestExecutor || new RequestExecutor(config);
    this.cacheHandler = config.cacheHandler || new CacheHandler(config);
    this.nonceStore = config.nonceStore || new NonceStore(this);
    this.apiKeyEncryptionOptions = new ApiKeyEncryptedOptions(config.apiKeyEncryptionOptions);
    this.resourceRequestLogger = config.resourceRequestLogger;
    var _request = null;
    Object.defineProperty(this, '_request', {
      get: function(){return _request;},
      set: function(value){_request = value;}
    });
    this._request = {};
  }
docs: @private
  
  @description
  
  Creates a new `DataStore` instance using the specified (required) `config`.
  The required `config` argument must contain a `RequestExecutor` instance or
  contain values that may be used to construct a `RequestExecutor` instance
  (like an `apiKey`).
  
  A `DataStore` interacts with the REST API server on behalf of SDK users.
  
  The DataStore delegates raw request execution to an internal
  [RequestExecutor](RequestExecutor.js.html) instance. In future SDK releases,
  the DataStore will also coordinate with a caching layer, reducing round trips
  to the server.
  
  It is important that the DataStore acts as an intermediary, decoupling
  SDK users from raw request logic: because interaction goes through the DataStore,
  additional features (like caching) can be added at any point in the future
  without requiring changes to SDK users' code.
  
  @param {Object} config
  Required configuration object that either provides a `requestExecutor` or
  values that may be used to instantiate a `RequestExecutor`.
  
  @param {Object} config.cacheOptions
  Cache manager options.