         if (_data == value)
             return;
 
-        // Clear out the existing segments 
-        segments = []; 
-        
-        //If there's no processing that needs to 
-        //occur, exit early. 
-        if (!value)
-        {
-            _data = value;
-            return;
-        }
-        
-        // Split letter followed by number (ie "M3" becomes "M 3")
-        var temp:String = value.replace(/([A-Za-z])([0-9\-\.])/g, "$1 $2");
-        
-        // Split number followed by letter (ie "3M" becomes "3 M")
-        temp = temp.replace(/([0-9\.])([A-Za-z\-])/g, "$1 $2");
-        
-        // Split letter followed by letter (ie "zM" becomes "z M")
-        temp = temp.replace(/([A-Za-z\-])([A-Za-z\-])/g, "$1 $2");
-        
-        // Replace commas with spaces
-        temp = temp.replace(/,/g, " ");
-        
-        // Trim leading and trailing spaces
-        temp = temp.replace(/^\s+/, "");
-        temp = temp.replace(/\s+$/, ""); 
-        
-        // Finally, split the string into an array 
-        var args:Array = temp.split(/\s+/);
-        var newSegments:Array = [];
-        
-        var identifier:String;
-        var prevIdentifier:String = "";
-        var prevX:Number = 0;
-        var prevY:Number = 0;
-        var lastMoveX:Number = 0;
-        var lastMoveY:Number = 0;
-        var x:Number;
-        var y:Number;
-        var controlX:Number;
-        var controlY:Number;
-        var control2X:Number;
-        var control2Y:Number;
-        
-        var getNumber:Function = function(useRelative:Boolean, index:int, offset:Number):Number
-        {
-            var result:Number = args[index];
-            
-            if (useRelative)
-                result += offset;
-            
-            return result;
-        }
-        
-        for (var i:int = 0; i < args.length; )
-        {
-            if (isNaN(Number(args[i])))
-            {
-                identifier = args[i];
-                i++;
-            }
-            else if (prevIdentifier == "m" || prevIdentifier == "M")
-            {
-                // If a moveto is followed by multiple pairs of coordinates, 
-                // the subsequent pairs are treated as implicit lineto commands. 
-                identifier = prevIdentifier == "m" ? "l" : "L";
-            }
-            
-            // Convert to lowercase to make the following comparison logic simpler
-            prevIdentifier = prevIdentifier.toLowerCase();
-            
-            var useRelative:Boolean = (identifier.toLowerCase() == identifier);
-            
-            switch (identifier.toLowerCase())
-            {
-                case "m":
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new MoveSegment(x, y));
-                    lastMoveX = x;
-                    lastMoveY = y;
-                    break;
-                
-                case "l":
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new LineSegment(x, y));
-                    break;
-                
-                case "h":
-                    x = getNumber(useRelative, i++, prevX);
-                    y = prevY;
-                    newSegments.push(new LineSegment(x, y));
-                    break;
-                
-                case "v":
-                    x = prevX;
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new LineSegment(x, y));
-                    break;
-                
-                case "q":
-                    controlX = getNumber(useRelative, i++, prevX);
-                    controlY = getNumber(useRelative, i++, prevY);
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new QuadraticBezierSegment(controlX, controlY, x, y));
-                    break;
-                
-                case "t":
-                    // control is a reflection of the previous control point
-                    if (prevIdentifier == "t" || prevIdentifier == "q")
-                    {
-                        controlX = prevX + (prevX - controlX);
-                        controlY = prevY + (prevY - controlY);
-                    }
-                    else
-                    {
-                        controlX = prevX;
-                        controlY = prevY;
-                    }
-                    
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new QuadraticBezierSegment(controlX, controlY, x, y));
-                    break;
-                    
-                case "c":
-                    controlX = getNumber(useRelative, i++, prevX);
-                    controlY = getNumber(useRelative, i++, prevY);
-                    control2X = getNumber(useRelative, i++, prevX);
-                    control2Y = getNumber(useRelative, i++, prevY);
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new CubicBezierSegment(controlX, controlY, 
-                                      control2X, control2Y, x, y));
-                    break;
-                
-                case "s":
-                    // Control1 is a reflection of the previous control2 point
-                    if (prevIdentifier == "s" || prevIdentifier == "c")
-                    {
-                        controlX = prevX + (prevX - control2X);
-                        controlY = prevY + (prevY - control2Y);
-                    }
-                    else
-                    {
-                        controlX = prevX;
-                        controlY = prevY;
-                    }
-                    
-                    control2X = getNumber(useRelative, i++, prevX);
-                    control2Y = getNumber(useRelative, i++, prevY);
-                    x = getNumber(useRelative, i++, prevX);
-                    y = getNumber(useRelative, i++, prevY);
-                    newSegments.push(new CubicBezierSegment(controlX, controlY,
-                                        control2X, control2Y, x, y));
-                    break;
-                case "z":
-                    // For a close segment, we generate a LineSegment to the last move point instead.  
-					x = lastMoveX;
-					y = lastMoveY;
-                    newSegments.push(new LineSegment(x, y));
-                    break;
-                
-                default:
-                    // unknown identifier, throw error?
-                    return;
-                    break;
-            }
-            
-            prevX = x;
-            prevY = y;
-            prevIdentifier = identifier;
-        }
-        
-        segments = newSegments;
-        graphicsPathChanged = true;
-        boundsChanged(); 
-        
-        // Set the _data backing var as the last step since notifyElementChanged
-        // clears the value.
+		segments = new PathSegmentsCollection(value);
+
+		graphicsPathChanged = true;
+
+		// Clear our cached measurement and data values
+		clearCachedBoundingBoxWithStroke();
+		invalidateSize();
+		invalidateDisplayList();
+
         _data = value;
     }
-    
+
     /** 
      *  @private
      */

     *  @playerversion AIR 1.5
     *  @productversion Flex 4
     */ 
    private var segments:Array = []; 
    
    /**
     *  A GraphicsPath object that contains the drawing 
     *  commands to draw this Path.  

            if (start >= count)
                break; // No more segments with valid tangents

            var startSegment:PathSegment = seg[start];
            if (startSegment is MoveSegment)
            {
                // remember the last move segment 
