     
     func minimumBottomSpace(points:CGFloat) -> UIView {
         if let spv = superview {
-            let c = NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .LessThanOrEqual, toItem: spv, attribute: .Bottom, multiplier: 1, constant: -points)
-            spv.addConstraint(c)
-        }
-        return self
-    }
-    
-    
-    func margin(top top:CGFloat? = nil, right:CGFloat? = nil, bottom:CGFloat? = nil, left:CGFloat? = nil) -> UIView {
-        if let t = top {
-            self.top(t)
+            let c = constraint(item: self, attribute: .Bottom, relatedBy: .LessThanOrEqual, toItem: spv, attribute: .Bottom, constant: -points)
+            spv.addConstraint(c)
+        }
+        return self
+    }
+    
+    
+    //    func margin(top top:CGFloat? = nil, right:CGFloat? = nil, bottom:CGFloat? = nil, left:CGFloat? = nil) -> UIView {
+    //        if let t = top {
+    //            self.top(t)
+    //        }
+    //
+    //        if let r = right {
+    //            self.right(r)
+    //        }
+    //
+    //        if let b = bottom {
+    //            self.bottom(b)
+    //        }
+    //
+    //        if let l = left {
+    //            self.left(l)
+    //        }
+    //        return self
+    //    }
+    
+    func fillH(m points:CGFloat = 0) -> UIView {
+        if let spv = superview {
+            let c1 = constraint(item: self, attribute: .Left, toItem: spv, constant: points)
+            let c2 = constraint(item: self, attribute: .Right, toItem: spv, constant: -points)
+            spv.addConstraints([c1,c2])
+        }
+        return self
+    }
+    
+    func fillV(m points:CGFloat = 0) -> UIView {
+        if let spv = superview {
+            let c1 = constraint(item: self, attribute: .Top, toItem: spv, constant: points)
+            let c2 = constraint(item: self, attribute: .Bottom, toItem: spv, constant: -points)
+            spv.addConstraints([c1,c2])
+        }
+        return self
+    }
+    
+    func centerInContainer() {
+        if let spv = superview {
+            alignCenter(self, with: spv)
+        }
+    }
+    
+    func centerHorizontallyInContainer() {
+        if let spv = superview {
+            alignVertically(self, with: spv)
+        }
+    }
+    
+    func centerVerticallyInContainer() {
+        if let spv = superview {
+            alignHorizontally(self, with: spv)
+        }
+    }
+}
+
+// MARK: - Stacks
+
+extension UIView {
+    
+    func stackH(m points:CGFloat = 0, v:UIView) -> UIView {
+        if let spv = superview {
+            let c = constraint(item: v, attribute: .Left, toItem: self, attribute: .Right, constant:points)
+            spv.addConstraint(c)
+        }
+        return v
+    }
+    
+    func stackV(m points:CGFloat = 0, v:UIView) -> UIView {
+        if let spv = superview {
+            let c = constraint(item: v, attribute: .Top, toItem: self, attribute: .Bottom, constant:points)
+            spv.addConstraint(c)
+        }
+        return v
+    }
+    
+    
+    // # MAGICK cant you see the matrix?????  10101010100001100010101
+    
+    func stackV(objects:[AnyObject]) -> [UIView] {
+        var previousMargin:CGFloat? = nil
+        for (i,o) in objects.enumerate() {
+            if let v = o as? UIView {
+                if let pm = previousMargin {
+                    if i == 1 {
+                        v.top(pm) // only if first view
+                    } else {
+                        let vx = objects[i-2] as! UIView
+                        vx.stackV(m:pm, v:v)
+                    }
+                    previousMargin = nil
+                } else {
+                    
+                    if i != 0 {
+                        if let previousView = objects[i-1] as? UIView {
+                            previousView.stackV(v: v) // Stacks two consecutive views
+                        }
+                    }
+                }
+            } else if let m = o as? CGFloat {
+                previousMargin = m // Store margin for next pass
+                
+                if i == (objects.count - 1) {
+                    //Last Margin, Bottom
+                    if let previousView = objects[i-1] as? UIView {
+                        previousView.bottom(m)
+                    }
+                }
+            }
+        }
+        return objects.filter {$0 is UIView } as! [UIView]
+    }
+    
+    func stackH(objects:[AnyObject]) -> [UIView] {
+        var previousMargin:CGFloat? = nil
+        for (i,o) in objects.enumerate() {
+            if let v = o as? UIView {
+                if let pm = previousMargin {
+                    if i == 1 {
+                        v.left(pm) // only if first view
+                    } else {
+                        print(objects[i-2])
+                        let vx = objects[i-2] as! UIView
+                        vx.stackH(m:pm, v:v)
+                        //                        if let v2 = objects[i+1] as? UIView {
+                        //                            v.stackV(m:8, v: v2)
+                        //                        }
+                    }
+                    previousMargin = nil
+                } else {
+                    
+                    if i != 0 {
+                        if let previousView = objects[i-1] as? UIView {
+                            previousView.stackH(v: v) // Stacks two consecutive views
+                        }
+                    }
+                }
+            } else if let m = o as? CGFloat {
+                previousMargin = m // Store margin for next pass
+                
+                if i == (objects.count - 1) {
+                    //Last Margin, Bottom
+                    if let previousView = objects[i-1] as? UIView {
+                        previousView.right(m)
+                    }
+                }
+            }
         }
         
-        if let r = right {
-            self.right(r)
-        }
-        
-        if let b = bottom {
-            self.bottom(b)
-        }
-        
-        if let l = left {
-            self.left(l)
-        }
-        return self
-    }
-    
-    func fillH(m points:CGFloat = 0) -> UIView {
-        if let spv = superview {
-            let c1 = NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: spv, attribute: .Left, multiplier: 1, constant: points)
-            let c2 = NSLayoutConstraint(item: self, attribute: .Right, relatedBy: .Equal, toItem: spv, attribute: .Right, multiplier: 1, constant: -points)
-            spv.addConstraints([c1,c2])
-        }
-        return self
-    }
-    
-    func fillV(m points:CGFloat = 0) -> UIView {
-        if let spv = superview {
-            let c1 = NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: spv, attribute: .Top, multiplier: 1, constant: points)
-            let c2 = NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: spv, attribute: .Bottom, multiplier: 1, constant: -points)
-            spv.addConstraints([c1,c2])
-        }
-        return self
-    }
-    
-}
-
-// MARK: - Stacks
-
-extension UIView {
-
-    func stackH(m points:CGFloat = 0, v:UIView) -> UIView {
-        if let spv = superview {
-            let c = NSLayoutConstraint(item: v, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Right, multiplier: 1, constant:points)
-            spv.addConstraint(c)
-        }
-        return v
-    }
-    
-    func stackV(m points:CGFloat = 0, v:UIView) -> UIView {
-        if let spv = superview {
-            let c = NSLayoutConstraint(item: v, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant:points)
-            spv.addConstraint(c)
-        }
-        return v
-    }
-}
-
-
-//MARK: - Other 
-
-extension UIView {
-    func fillContainer() {
+        return objects.filter {$0 is UIView } as! [UIView]
+    }
+    
+}
+
+
+//MARK: - Other
+
+extension UIView {
+    func fillContainer(padding:CGFloat = 0) {
         if let spv = superview {
             let cs = [
-                NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: spv, attribute: .Top, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Right, relatedBy: .Equal, toItem: spv, attribute: .Right, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: spv, attribute: .Bottom, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: spv, attribute: .Left, multiplier: 1, constant: 0)
+                constraint(item: self, attribute: .Top, toItem: spv, constant: padding),
+                constraint(item: self, attribute: .Right, toItem: spv, constant: -padding),
+                constraint(item: self, attribute: .Bottom, toItem: spv, constant: -padding),
+                constraint(item: self, attribute: .Left, toItem: spv, constant: padding)
             ]
             spv.addConstraints(cs)
         }
     }
-
+    
+    
     func followEdges(otherView:UIView) {
         if let spv = superview {
             let cs = [
-                NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: otherView, attribute: .Top, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Right, relatedBy: .Equal, toItem: otherView, attribute: .Right, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: otherView, attribute: .Bottom, multiplier: 1, constant: 0),
-                NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: otherView, attribute: .Left, multiplier: 1, constant: 0)
+                constraint(item: self, attribute: .Top, toItem: otherView),
+                constraint(item: self, attribute: .Right, toItem: otherView),
+                constraint(item: self, attribute: .Bottom, toItem: otherView),
+                constraint(item: self, attribute: .Left, toItem: otherView)
             ]
             spv.addConstraints(cs)
         }
     }
-
+    
     func heightEqualsWidth() {
         if let spv = superview {
-            let c = NSLayoutConstraint(item: self, attribute: .Height, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1, constant: 0)
-            spv.addConstraint(c)
-        }
-    }
-
+            let c = constraint(item: self, attribute: .Height, toItem: self, attribute: .Width)
+            spv.addConstraint(c)
+        }
+    }
+    
+}
+
+func H(points:CGFloat) -> (v:UIView) -> UIView {
+    return { v in
+        return v.height(points)
+    }
+}
+
+func margin(x:CGFloat) -> CGFloat {
+    return x
 }
extension UIView {
    
    func height(points:CGFloat) -> UIView {
        let c = NSLayoutConstraint(item: self, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: points)
        addConstraint(c)
        return self
    }
    
    func width(points:CGFloat) -> UIView {
        let c = NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: points)
        addConstraint(c)
        return self
    }

// MARK: - Position

extension UIView {
    
    func left(points:CGFloat) -> UIView {
        if let spv = superview {
            let c = constraint(item: self, attribute: .Left, toItem: spv, constant: points)
            spv.addConstraint(c)
        }
        return self
