         }
     }
     
+    private func setupLayers() {
+        self.layer.addSublayer(backgroundLayer)
+        self.backgroundLayer.addSublayer(fillAnimationLayer)
+        self.layer.addSublayer(foregroundLayer)
+        
+        var midPoint = CGPoint(x: backgroundLayer.bounds.size.width / 2, y: backgroundLayer.bounds.size.height / 2)
+        fillAnimationLayer.backgroundColor = fillColor.CGColor
+        fillAnimationLayer.frame = CGRect(origin: midPoint, size: CGSize.zeroSize)
+        
+        updateLayers()
+    }
+    
+    private func updateLayers() {
+        backgroundLayer.frame = CGRect(origin: CGPointZero, size: frame.size)
+        backgroundLayer.cornerRadius = cornerRadius
+        backgroundLayer.borderWidth = borderWidth
+        backgroundLayer.borderColor = borderColor.CGColor
+        backgroundLayer.masksToBounds = true
+        foregroundLayer.frame = frame
+    }
+}
+
+// MARK: - Label
+extension NDFillButton {
+    private func setupLabel() {
+        updateLabel(false)
+        self.addSubview(textLabel)
+        textLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
+        var centerX = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: textLabel, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0.0)
+        var centerY = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: textLabel, attribute: NSLayoutAttribute.CenterY, multiplier: 1.0, constant: 0.0)
+        self.addConstraints([centerX, centerY])
+    }
+    
+    private func updateLabel(animated: Bool) {
+        if(!animated) {
+            self.changeLabelText()
+            return
+        }
+        UIView.animateWithDuration(0.1, animations: { () -> Void in
+            self.textLabel.transform = CGAffineTransformMakeScale(0.1, 0.1)
+            }) { (anim) -> Void in
+                self.changeLabelText()
+                UIView.animateWithDuration(0.2, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: UIViewAnimationOptions.allZeros, animations: { () -> Void in
+                    self.textLabel.transform = CGAffineTransformMakeScale(1, 1)
+                    }, completion:nil)
+        }
+    }
+    
     private func changeLabelText() {
         var fontName: String
         var fontSize: CGFloat

        }
    }
    
    
    override public var frame: CGRect {
        didSet {
        }

    @objc public func toggle() {
        active = !active
    }

    @objc public func setActive(active: Bool, animated: Bool) {
        animateEnabled = animated
        self.active = active
        animateEnabled = true
    }
    
}

// MARK: - Touch Overrides
extension NDFillButton {
    override public func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool {
        pressed = true
        return true
    }
    
    override public func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool {
        return true
    }
    
    override public func endTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) {
        pressed = false
    }
    
    override public func cancelTrackingWithEvent(event: UIEvent?) {
        pressed = false
    }
}

// MARK: - private functions
extension NDFillButton {
    private func animateFill(active: Bool, animated: Bool) {
        var scale = UIScreen.mainScreen().scale
        var R = sqrt(backgroundLayer.bounds.size.height * backgroundLayer.bounds.size.height + backgroundLayer.bounds.size.width * backgroundLayer.bounds.size.width) / 2
