     ///
     /// - warning: Multiple instances with the same path are *not* allowed as they
     /// would conflict with each other.
-    internal init(path: URL) throws {
+    public init(path: URL) throws {
         self.path = path
         try FileManager.default.createDirectory(at: 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
    internal func cachedData(for key: Key, _ completion: @escaping (Data?) -> Void) -> Cancellable {
        let work = DispatchWorkItem { [weak self] in
            completion(self?[key])
        }


    /// Stores data for the given key. The method returns instantly and the data
    /// is written asyncrhonously.
    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.
    public func removeData(for key: Key) {
        self[key] = nil
    }

