     public static var shared: Self {
         let className = String(describing: self)
         guard let singleton = userSettingsSingletons[className] as? Self else {
-            let singleton = Self()
+            let singleton = Self.init(classType: self)
             userSettingsSingletons[className] = singleton
             return singleton
         }
         return singleton
+    }
+
+    public func clearInstances() {
+        userSettingsSingletons = [:]
     }
 }
 

            userDefaults.removeObject(forKey: usKey)
            return
        }
        let archivedObject = NSKeyedArchiver.archivedData(withRootObject: object)
        userDefaults.set(archivedObject, forKey: usKey)
        userDefaults.synchronize()
    }
}

        }
    }

    private func userDefaultsKey(forProperty property: Property) -> String {
        return "\(uniqueIdentifierKey).\(property)"
    }

    private func saveDefaultValue(_ property: Property) {
        guard let object = self.value(forKeyPath: property) else { return }
        let archivedObject = try? NSKeyedArchiver.data(object: object)
        defaultValues[property] = archivedObject
    }

    private func fillProperty(_ property: Property) {
        if let data = userDefaults.object(forKey: userDefaultsKey(forProperty: property)) as? Data {
            let value = NSKeyedUnarchiver.object(data: data)
            self.setValue(value, forKey: property)
        }
    }
