 
     /// Stores data for the given key. The method returns instantly and the data
     /// is written asyncrhonously.
-    internal func storeData(_ data: Data, for key: Key) {
+    public func storeData(_ data: Data, for key: Key) {
         self[key] = data
     }
 
     /// Removes data for the given key. The method returns instantly, the data
     /// is removed asyncrhonously.
-    internal func removeData(for key: Key) {
+    public func removeData(for key: Key) {
         self[key] = nil
     }
 

    /// asyncrhonously.
    internal func removeAll() {
        _lock.sync {
        let change = _staging.removeAll()
            _wqueue.async {
                try? FileManager.default.removeItem(at: self.path)
                try? FileManager.default.createDirectory(at: self.path, withIntermediateDirectories: true, attributes: nil)

    /// Retrieves data from cache for the given key. The completion will be called
    /// syncrhonously if there is no cached data for the given key.
    @discardableResult
    public func cachedData(for key: Key, _ completion: @escaping (Data?) -> Void) -> Cancellable {
        let work = DispatchWorkItem { [weak self] in
            completion(self?[key])
        }
