get(sKey, oLoadOptions, bAsync){
			if (this._oCache.has(sKey)) {
				const oExisting = this._oCache.get(sKey);
				if (bAsync){
					return Promise.resolve(oExisting);
				} else if (!(oExisting instanceof Promise)) {
					return oExisting;
				}
				// can't use cached, non-fulfilled promise in sync mode
			}

			const oNewEntry = this._load(oLoadOptions);
			if (oNewEntry instanceof Promise) {
				// update cache entry with actual object instead of fulfilled promise
				oNewEntry.then((oResult) => {
					if (oResult) {
						this._set(sKey, oResult);
					} else {
						this._delete(sKey);
					}
				}).catch((e) => {
					this._delete(sKey);
					throw e;
				});
			}
			if (oNewEntry) {
				this._set(sKey, oNewEntry);
			}
			return oNewEntry;
		}
Retrieves an entry from the cache

@param {string} sKey the cache id
@param {object} [oLoadOptions] options which are passed to #load
@param {boolean} [bAsync=false] async requested
@returns {object} entry which either comes from cache or from #load
@private