             }
         }
     }
-    
-    public var font: UIFont = UIFont.systemFontOfSize(17) {
-        didSet {
-            applyAttributeWithKey(NSFontAttributeName, value: font)
-        }
-    }
-    
-    public var textColor: UIColor = UIColor.blackColor() {
-        didSet {
-            applyAttributeWithKey(NSForegroundColorAttributeName, value: textColor)
-        }
-    }
-    
-    public var textAlignment: NSTextAlignment = .Left {
-        didSet {
-            applyAttributeWithKey(NSParagraphStyleAttributeName, value: paragraphStyle)
-        }
-    }
-    
-    public var lineBreakMode: NSLineBreakMode = .ByTruncatingTail {
-        didSet {
-            textContainer.lineBreakMode = lineBreakMode
-            applyAttributeWithKey(NSParagraphStyleAttributeName, value: paragraphStyle)
-        }
+    private var _attributedText: NSAttributedString?
+    
+    private struct Defaults {
+        static var font = UIFont.systemFontOfSize(17)
+        static var textColor = UIColor.blackColor()
+        static var textAlignment = NSTextAlignment.Left
+        static var lineBreakMode = NSLineBreakMode.ByTruncatingTail
+    }
+    
+    public var font: UIFont {
+        get { return _font }
+        set {
+            _font = newValue
+            applyAttributeWithKey(NSFontAttributeName, value: _font)
+        }
+    }
+    private var _font = Defaults.font
+    
+    public var textColor: UIColor {
+        get { return _textColor }
+        set {
+            _textColor = newValue
+            applyAttributeWithKey(NSForegroundColorAttributeName, value: _textColor)
+        }
+    }
+    private var _textColor = Defaults.textColor
+    
+    public var textAlignment: NSTextAlignment {
+        get { return _textAlignment }
+        set {
+            _textAlignment = newValue
+            applyAttributeWithKey(NSParagraphStyleAttributeName, value: _paragraphStyle)
+        }
+    }
+    private var _textAlignment = Defaults.textAlignment
+    
+    public var lineBreakMode: NSLineBreakMode {
+        get { return _lineBreakMode }
+        set {
+            _lineBreakMode = newValue
+            textContainer.lineBreakMode = _lineBreakMode
+            applyAttributeWithKey(NSParagraphStyleAttributeName, value: _paragraphStyle)
+        }
+    }
+    private var _lineBreakMode = Defaults.lineBreakMode
+    
+    private var _paragraphStyle: NSParagraphStyle {
+        let style = NSMutableParagraphStyle()
+        style.alignment = _textAlignment
+        style.lineBreakMode = _lineBreakMode
+        return style
     }
     
     public var shadowColor: UIColor? {
-        didSet {
-            applyAttributeWithKey(NSShadowAttributeName, value: shadow)
-        }
-    }
+        get { return _shadowColor }
+        set {
+            _shadowColor = newValue
+            applyAttributeWithKey(NSShadowAttributeName, value: _shadow)
+        }
+    }
+    private var _shadowColor: UIColor?
     
     public var shadowOffset: CGSize? {
-        didSet {
-            applyAttributeWithKey(NSShadowAttributeName, value: shadow)
-        }
+        get { return _shadowOffset }
+        set {
+            _shadowOffset = newValue
+            applyAttributeWithKey(NSShadowAttributeName, value: _shadow)
+        }
+    }
+    private var _shadowOffset: CGSize?
+    
+    private var _shadow: NSShadow? {
+        if let color = _shadowColor {
+            let shadow = NSShadow()
+            shadow.shadowColor = color
+            if let offset = _shadowOffset {
+                shadow.shadowOffset = offset
+            }
+            return shadow
+        }
+        return nil
     }
     
     public var linkHighlightColor: UIColor = UIColor(white: 0, alpha: 0.2)

    
    // MARK: Applying Attributes
    
    private var paragraphStyle: NSParagraphStyle {
        let style = NSMutableParagraphStyle()
        style.alignment = textAlignment
        style.lineBreakMode = lineBreakMode
        return style
    }
    
    private var shadow: NSShadow? {
        if let color = shadowColor {
            let shadow = NSShadow()
            shadow.shadowColor = color
            if let offset = shadowOffset {
                shadow.shadowOffset = offset
            }
            return shadow
        }
        return nil
    }
    
    private func clear() {
        textStorage.deleteCharactersInRange(NSRange(location: 0, length: textStorage.length))
        invalidateDisplayAndLayout()

        textStorage.mutableString.setString(string)
        cacheLinkRanges()
        
        applyAttributeWithKey(NSFontAttributeName, value: _font)
        applyAttributeWithKey(NSForegroundColorAttributeName, value: _textColor)
        applyAttributeWithKey(NSParagraphStyleAttributeName, value: _paragraphStyle)
        applyAttributeWithKey(NSShadowAttributeName, value: shadow)
        
        _attributedText = textStorage.copy() as? NSAttributedString
