 
 let separator = "."
 
-extension UIButton {
-
-    @IBInspectable
-    public var localizationKey: String? {
-        get {
-            return objc_getAssociatedObject(self, &runtimeLocalizationKey) as? String
-        }
-        set {
-            objc_setAssociatedObject(self, &runtimeLocalizationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
-            guard let newValue = newValue, !newValue.isEmpty else { return }
+public protocol Localizable {
+    var localizationKey: String? { get set }
+}
+
+extension UIButton: Localizable {
+
+    @IBInspectable
+    public var localizationKey: String? {
+        get {
+            return objc_getAssociatedObject(self, &runtimeLocalizationKey) as? String
+        }
+        set {
+            objc_setAssociatedObject(self, &runtimeLocalizationKey, newValue, .OBJC_ASSOCIATION_RETAIN)
+            guard let key = newValue, !key.isEmpty else { return }
 
             let properties: [(ButtonLocalizedProperty, UIControlState)] = [
                 (.normal, .normal),

    }
}

extension UITextField {

    @IBInspectable
    public var localizationKey: String? {
        get {
            return objc_getAssociatedObject(self, &runtimeLocalizationKey) as? String
        }
        set {
            objc_setAssociatedObject(self, &runtimeLocalizationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            guard let newValue = newValue, !newValue.isEmpty else { return }

            let textKey = newValue + separator + TextFieldLocalizedProperty.text.description

            if let text = localized(textKey) {
                if let mutableAttributedText = attributedText?.mutableCopy() as? NSMutableAttributedString {

    }
}

extension UIBarButtonItem: Localizable {

    @IBInspectable
    public var localizationKey: String? {
        get {
            return objc_getAssociatedObject(self, &runtimeLocalizationKey) as? String
        }
        set {
            objc_setAssociatedObject(self, &runtimeLocalizationKey, newValue, .OBJC_ASSOCIATION_RETAIN)
            guard let key = newValue, !key.isEmpty else { return }

            title = localized(key) ?? key
        }
    }
}
