 
 public class SVGPath {
     public var commands: [SVGCommand] = []
-    private var builder: SVGCommandBuilder?
+    private var builder: SVGCommandBuilder = moveTo
     private var coords: Coordinates = .Absolute
+    private var stride: Int = 2
     private var numbers = ""
 
     public init (_ string: String) {
         for char in string {
             switch char {
-            case "M": use(.Absolute, moveTo)
-            case "m": use(.Relative, moveTo)
-            case "L": use(.Absolute, lineTo)
-            case "l": use(.Relative, lineTo)
-            case "V": use(.Absolute, lineToVertical)
-            case "v": use(.Relative, lineToVertical)
-            case "H": use(.Absolute, lineToHorizontal)
-            case "h": use(.Relative, lineToHorizontal)
-            case "Q": use(.Absolute, quadBroken)
-            case "q": use(.Relative, quadBroken)
-            case "T": use(.Absolute, quadSmooth)
-            case "t": use(.Relative, quadSmooth)
-            case "C": use(.Absolute, cubeBroken)
-            case "c": use(.Relative, cubeBroken)
-            case "S": use(.Absolute, cubeSmooth)
-            case "s": use(.Relative, cubeSmooth)
+            case "M": use(.Absolute, 2, moveTo)
+            case "m": use(.Relative, 2, moveTo)
+            case "L": use(.Absolute, 2, lineTo)
+            case "l": use(.Relative, 2, lineTo)
+            case "V": use(.Absolute, 1, lineToVertical)
+            case "v": use(.Relative, 1, lineToVertical)
+            case "H": use(.Absolute, 1, lineToHorizontal)
+            case "h": use(.Relative, 1, lineToHorizontal)
+            case "Q": use(.Absolute, 4, quadBroken)
+            case "q": use(.Relative, 4, quadBroken)
+            case "T": use(.Absolute, 2, quadSmooth)
+            case "t": use(.Relative, 2, quadSmooth)
+            case "C": use(.Absolute, 6, cubeBroken)
+            case "c": use(.Relative, 6, cubeBroken)
+            case "S": use(.Absolute, 4, cubeSmooth)
+            case "s": use(.Relative, 4, cubeSmooth)
             default: numbers.append(char)
             }
         }
         finishLastCommand()
     }
     
-    private func use (coords: Coordinates, _ builder: SVGCommandBuilder) {
+    private func use (coords: Coordinates, _ stride: Int, _ builder: SVGCommandBuilder) {
         finishLastCommand()
         self.builder = builder
         self.coords = coords
+        self.stride = stride
     }
     
     private func finishLastCommand () {
-        if let buildCommands = builder {
-            for command in buildCommands(SVGPath.parseNumbers(numbers), commands.last, coords) {
-                var c = command
-                c.relativeTo(commands.last, coords: coords)
-                commands.append(c)
-            }
+        for command in take(SVGPath.parseNumbers(numbers), stride, coords, commands.last, builder) {
+            commands.append(coords == .Relative ? command.relativeTo(commands.last) : command)
         }
         numbers = ""
     }

    return CGPoint(x: a.x - b.x, y: a.y - b.y)
}

private func take (numbers: [CGFloat], stride: Int, last: SVGCommand?, callback: (Slice<CGFloat>, SVGCommand?) -> SVGCommand) -> [SVGCommand] {
    var out: [SVGCommand] = []
    var lastCommand:SVGCommand? = last


    
    for var i = 0; i < count; i += stride {
        let nums = numbers[i..<i + stride]
        lastCommand = callback(nums, lastCommand, coords)
        out.append(lastCommand!)
    }
    
