 
 public class UserDefalutsEnumProxy<Type>: UserDefalutsProxy<Type> where Type: RawRepresentable {
     
-    public required init(userDefaults: UserDefaults = UserDefaults.standard, key: String, defaultValue: Type) {
-        super.init(userDefaults: userDefaults, key: key, defaultValue: defaultValue)
+    public required init(key: String, defaultValue: Type) {
+        super.init(key: key, defaultValue: defaultValue)
     }
     
     public override var value: Type {
         get {
-            guard let rawValue = self.userDefaults.object(forKey: self.key) as? Type.RawValue else { return self.defaultValue }
+            
+            guard let rawValue = self.userDefaults.getValue(self.key) as? Type.RawValue else { return self.defaultValue }
             return Type.init(rawValue: rawValue) ?? self.defaultValue
         }
         set {
             let rawValue = newValue.rawValue
-            self.userDefaults.set(rawValue, forKey: self.key)
-        }
-    }
-}
-
+            self.userDefaults.setValue(rawValue, key: self.key)
+        }
+    }
+}
+

        }
    }
    open func remove() {
        self.userDefaults.removeObject(forKey: self.key)
    }
}

public class UserDefalutsURLProxy : UserDefalutsProxy<URL> {
    
    public required init(userDefaults: UserDefaults = UserDefaults.standard, key: String, defaultValue: URL) {
        super.init(userDefaults: userDefaults, key: key, defaultValue: defaultValue)
    }
    
    public override var value: URL {
        get {
            return self.userDefaults.url(forKey: self.key) ?? self.defaultValue
        }
        set {
            self.userDefaults.set(newValue, forKey: self.key)
        }
    }
}

public class UserDefalutsURLOptProxy : UserDefalutsOptionalProxy<URL> {
    
    public required init(userDefaults: UserDefaults = UserDefaults.standard, key: String) {
        super.init(userDefaults: userDefaults, key: key)
    }
    
    public override var value: URL? {
        get {
            return self.userDefaults.url(forKey: self.key)
        }
        set {
            if let newValue = newValue {
                self.userDefaults.set(newValue, forKey: self.key)
            }
            else {
                self.remove()

    }
}

public class UserDefaultsContainer {
    
    public static var resolve: ()->UserDefaultsProtocol = {
        return UserDefaults.standard
    }
    
}

open class UserDefalutsProxy<Type> {
    
    public let userDefaults: UserDefaultsProtocol
    public let key: String
    public let defaultValue: Type
    
    public required init(key: String, defaultValue: Type) {
        DuplicateKeyChecker.checkProc(key: key)
        
        self.userDefaults = UserDefaultsContainer.resolve()
        self.key = key
        self.defaultValue = defaultValue
    }
    
    open var value: Type {
        get {
            return self.userDefaults.getValue(self.key) as? Type ?? self.defaultValue
        }
        set {
            self.userDefaults.setValue(newValue, key: self.key)
        }
    }
}

open class UserDefalutsOptionalProxy<Type> {
    
    public let userDefaults: UserDefaultsProtocol
    public let key: String
    
    public required init(key: String) {
        DuplicateKeyChecker.checkProc(key: key)
        
        self.userDefaults = UserDefaultsContainer.resolve()
        self.key = key
    }
    
    open var value: Type? {
        get {
            return self.userDefaults.getValue(self.key) as? Type
        }
        set {
            if let newValue = newValue {
                self.userDefaults.setValue(newValue, key: self.key)
            }
            else {
                self.remove()
