 
 import UIKit
 
-private class Data<T> {
+private class Property<T> {
     var normal:      T?
     var highlighted: T?
     var selected:    T?

    
    // Appear
    public func build() {
        if let font = attachProperty(param: font, state: state) {
            button.titleLabel?.font = font
        }
        
        if let borderWidth = attachProperty(param: borderWidth, state: state) {
            button.layer.borderWidth = borderWidth
        }
        
        if let borderColor = attachProperty(param: borderColor, state: state) {
            button.layer.borderColor = borderColor.cgColor
        }
        
        if let cornerRadius = attachProperty(param: cornerRadius, state: state) {
            button.layer.cornerRadius = cornerRadius
        }
        
        if let opacity = attachProperty(param: opacity, state: state) {
            button.layer.opacity = opacity
        }
        
        if let backgroundColor = attachProperty(param: backgroundColor, state: state) {
            button.layer.backgroundColor = backgroundColor.cgColor
        }
        
        if let tintColor = attachProperty(param: tintColor, state: state) {
            button.tintColor = tintColor
        }
        
        if let shadowColor = attachProperty(param: shadowColor, state: state) {
            button.layer.shadowColor = shadowColor.cgColor
        }
        
        if let shadowOpacity = attachProperty(param: shadowOpacity, state: state) {
            button.layer.shadowOpacity = shadowOpacity
        }
        
        if let shadowOffset = attachProperty(param: shadowOffset, state: state) {
            button.layer.shadowOffset = shadowOffset
        }
        
        if let shadowRadius = attachProperty(param: shadowRadius, state: state) {
            button.layer.shadowRadius = shadowRadius
        }
        
        if let shadowPath = attachProperty(param: shadowPath, state: state) {
            button.layer.shadowPath = shadowPath
        }
        
        if let clipsToBounds = attachProperty(param: clipsToBounds, state: state) {
            button.clipsToBounds = clipsToBounds
        }
        
        if let masksToBounds = attachProperty(param: masksToBounds, state: state) {
            button.layer.masksToBounds = masksToBounds
        }
        
        if let isExclusiveTouch = attachProperty(param: isExclusiveTouch, state: state) {
            button.isExclusiveTouch = isExclusiveTouch
        }
        
        if let contentHorizontalAlignment = attachProperty(param: contentHorizontalAlignment, state: state) {
            button.contentHorizontalAlignment = contentHorizontalAlignment
        }
        
        if let contentVerticalAlignment = attachProperty(param: contentVerticalAlignment, state: state) {
            button.contentVerticalAlignment = contentVerticalAlignment
        }
        
        if let titleEdgeInsets = attachProperty(param: titleEdgeInsets, state: state) {
            button.titleEdgeInsets = titleEdgeInsets
        }
        
        if let contentEdgeInsets = attachProperty(param: contentEdgeInsets, state: state) {
            button.contentEdgeInsets = contentEdgeInsets
        }
        
        if let imageEdgeInsets = attachProperty(param: imageEdgeInsets, state: state) {
            button.imageEdgeInsets = imageEdgeInsets
        }
        
        if let reversesTitleShadowWhenHighlighted = attachProperty(param: reversesTitleShadowWhenHighlighted, state: state) {
            button.reversesTitleShadowWhenHighlighted = reversesTitleShadowWhenHighlighted
        }
        
        if let adjustsImageWhenHighlighted = attachProperty(param: adjustsImageWhenHighlighted, state: state) {
            button.adjustsImageWhenHighlighted = adjustsImageWhenHighlighted
        }
        
        if let adjustsImageWhenDisabled = attachProperty(param: adjustsImageWhenDisabled, state: state) {
            button.adjustsImageWhenDisabled = adjustsImageWhenDisabled
        }
        
        if let showsTouchWhenHighlighted = attachProperty(param: showsTouchWhenHighlighted, state: state) {
            button.showsTouchWhenHighlighted = showsTouchWhenHighlighted
        }
    }

        return self
    }
    
    private func setProperty<T>(param: Property<T>, value: T, state: ButtonStyleKit.ButtonState) {
        switch state {
        case .all:
            param.normal = value
