     }
 }
 
-public enum Appearance: Hashable, Equatable {
+public enum Appearance {
     // UIView
-    case translatesAutoresizingMaskIntoConstraints(Bool), backgroundColor(UIColor), tintColor(UIColor)
+    case userInteractionEnabled(Bool), translatesAutoresizingMaskIntoConstraints(Bool), backgroundColor(UIColor), tintColor(UIColor), tintAdjustmentMode(UIViewTintAdjustmentMode), cornerRadius(CGFloat), borderWidth(CGFloat), borderColor(UIColor), multipleTouchEnabled(Bool), exclusiveTouch(Bool), clipsToBounds(Bool), alpha(CGFloat), opaque(Bool), clearsContextBeforeDrawing(Bool), hidden(Bool), contentMode(UIViewContentMode)
 
     // UIControl
-
-    // UILabel
-    case font(UIFont), textColor(UIColor), textAlignment(NSTextAlignment), numberOfLines(Int), defaultLabelText(String)
-    case attributedString([Attributes]) // TODO: handle also NSParagrapheStyle
+    case enabled(Bool), selected(Bool), highlighted(Bool), contentVerticalAlignment(UIControlContentVerticalAlignment), contentHorizontalAlignment(UIControlContentHorizontalAlignment)
+
+    // UILabel & UITextView
+    case font(UIFont), textColor(UIColor), textAlignment(NSTextAlignment), numberOfLines(Int), lineBreakMode(NSLineBreakMode), defaultLabelText(String), selectedRange(NSRange), editable(Bool), selectable(Bool), dataDetectorTypes(UIDataDetectorTypes), allowsEditingTextAttributes(Bool), clearsOnInsertion(Bool), textContainerInset(UIEdgeInsets), linkTextAttributes(Attributes)
+    case attributedText([Attributes]) // TODO: handle also NSParagrapheStyle
 
     // UIButton
     case buttonType(UIButtonType), buttonTitle(String, UIControlState), buttonTitleColor(UIColor, UIControlState), buttonTitleShadowColor(UIColor, UIControlState), buttonImage(UIImage, UIControlState), buttonBackgroundImage(UIImage, UIControlState), buttonAttributedTitle([Attributes], UIControlState), contentEdgeInsets(UIEdgeInsets), titleEdgeInsets(UIEdgeInsets), reversesTitleShadowWhenHighlighted(Bool), imageEdgeInsets(UIEdgeInsets), adjustsImageWhenHighlighted(Bool), adjustsImageWhenDisabled(Bool), showsTouchWhenHighlighted(Bool)
 
     // UIImageView
-
-    // UITextView
+    case ratio(CGFloat)
+
     // UITextField
     // ...
 

    case custom([String: AnyObject])
    case none

    func toString() -> String {
        let strSelf = String(self)
        if let index = strSelf.characters.indexOf("(") {
            return String(self).substringToIndex(index)
        }
        return strSelf
    }

    func apply<Component: UIView>(to component: Component, useDefaultValue: Bool = false) {

        switch (self, component) {
        // UIView
        case (let .backgroundColor(color), _):
            component.setValue(useDefaultValue ? nil : color, forKey: toString())
        case (let .translatesAutoresizingMaskIntoConstraints(should), _):
            component.setValue(should.nsObject(), forKey: toString())

        // UILabel
        case (let .font(font), let label as UILabel):
            label.setValue(font, forKey: toString())
        case (let .textColor(color), let label as UILabel):
            label.setValue(color, forKey: toString())
        case (let .textAlignment(align), let label as UILabel):
            label.setValue(align.rawValue.nsObject(), forKey: toString())
        case (let .numberOfLines(number), let label as UILabel):
            label.setValue(number.nsObject(), forKey: toString())
        case (let .defaultLabelText(text), let label as UILabel):
            label.text = text
        case (let .attributedString(attributes), let label as UILabel):
            label.attributedText = attributedStringFromList(attributes)

        // UIButton
        case (let .buttonType(type), let button as UIButton):

//        }
//    }


    func toString() -> String {
        let strSelf = String(self)
        if let index = strSelf.characters.indexOf("(") {
            return String(self).substringToIndex(index)
        }
        return strSelf
    }

    private func attributedStringFromList(attrList: [Attributes]) -> NSAttributedString? {
