         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 DefaultsObjectBridge<T>: DefaultsBridge<T> {
    public override func save(key: String, value: T?, userDefaults: UserDefaults) {
        userDefaults.set(value, forKey: key)
    }

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

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

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

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

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

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

    public override func get(key: String, userDefaults: UserDefaults) -> Int? {
        if let int = userDefaults.number(forKey: key)?.intValue {
            return int
        }

    }
}

open class DefaultsBoolBridge: DefaultsBridge<Bool> {
    open override func save(key: String, value: Bool?, userDefaults: UserDefaults) {
        userDefaults.set(value, forKey: key)
    }

    open override func get(key: String, userDefaults: UserDefaults) -> Bool? {
        // @warning we use number(forKey:) instead of bool(forKey:), because
        // bool(forKey:) will always return value, even if it's not set
        //
