         userDefaults.set(encodable: value, forKey: key)
     }
 
-    public override func get(key: String, userDefaults: UserDefaults) -> T? {
+    open override func get(key: String, userDefaults: UserDefaults) -> T? {
         guard let data = userDefaults.data(forKey: key) else {
             return nil
         }
         return deserialize(data)
     }
 
-    public override func isSerialized() -> Bool {
-        return true
-    }
-
-    public override func deserialize(_ object: Any) -> T? {
+    open override func isSerialized() -> Bool {
+        return true
+    }
+
+    open override func deserialize(_ object: Any) -> T? {
         guard let data = object as? Data else { return nil }
 
         return try? JSONDecoder().decode(T.self, from: data)
     }
 }
 
-public final class DefaultsKeyedArchiverBridge<T>: DefaultsBridge<T> {
-
-    public override func get(key: String, userDefaults: UserDefaults) -> T? {
+open class DefaultsKeyedArchiverBridge<T>: DefaultsBridge<T> {
+
+    open override func get(key: String, userDefaults: UserDefaults) -> T? {
         guard let data = userDefaults.data(forKey: key) else {
             return nil
         }
         return deserialize(data)
     }
 
-    public override func save(key: String, value: T?, userDefaults: UserDefaults) {
+    open override func save(key: String, value: T?, userDefaults: UserDefaults) {
         guard let value = value else {
             userDefaults.removeObject(forKey: key)
             return

    }
}

public final class DefaultsDataBridge: DefaultsBridge<Data> {
    public override func save(key: String, value: Data?, userDefaults: UserDefaults) {
        userDefaults.set(value, forKey: key)
    }

    public override func get(key: String, userDefaults: UserDefaults) -> Data? {
        return userDefaults.data(forKey: key)
    }
}

public final class DefaultsUrlBridge: DefaultsBridge<URL> {
    public override func save(key: String, value: URL?, userDefaults: UserDefaults) {
        userDefaults.set(value, forKey: key)
    }

    public override func get(key: String, userDefaults: UserDefaults) -> URL? {
        return userDefaults.url(forKey: key)
    }

    public override func isSerialized() -> Bool {
        return true
    }

    public override func deserialize(_ object: Any) -> URL? {
        if let object = object as? URL {
            return object
        }

        }
    }

    open override func isSerialized() -> Bool {
        return true
    }

    open override func deserialize(_ object: Any) -> T? {
        guard let data = object as? Data else { return nil }

        return NSKeyedUnarchiver.unarchiveObject(with: data) as? T
    }
}

open class DefaultsRawRepresentableBridge<T: RawRepresentable>: DefaultsBridge<T> {

    open override func get(key: String, userDefaults: UserDefaults) -> T? {
        guard let object = userDefaults.object(forKey: key) else { return nil }

        return deserialize(object)
    }

    open override func save(key: String, value: T?, userDefaults: UserDefaults) {
        userDefaults.set(value?.rawValue, forKey: key)
    }

    open override func isSerialized() -> Bool {
        return true
    }

    open override func deserialize(_ object: Any) -> T? {
        guard let rawValue = object as? T.RawValue else { return nil }

        return T(rawValue: rawValue)
    }
}

open class DefaultsRawRepresentableArrayBridge<T: Collection>: DefaultsBridge<T> where T.Element: RawRepresentable {

    open override func get(key: String, userDefaults: UserDefaults) -> T? {
        guard let object = userDefaults.array(forKey: key) else { return nil }

        return deserialize(object)
    }

    open override func save(key: String, value: T?, userDefaults: UserDefaults) {
        let raw = value?.map { $0.rawValue }

        userDefaults.set(raw, forKey: key)
    }

    open override func isSerialized() -> Bool {
        return true
    }

    open override func deserialize(_ object: Any) -> T? {
        guard let rawValue = object as? [T.Element.RawValue] else { return nil }

        return rawValue.compactMap { T.Element(rawValue: $0) } as? T
