             baseTransform = newValue * translate.inverse * rotate.inverse * scale.inverse * translate
         }
     }
+    
+    var cache = Cache()
     
     public init() {
         self.components = []

    
    public typealias Index = Int
    
    fileprivate class Cache {
        
        var originalBoundary: Rect?
        var boundary: Rect?
        var identity : Shape?
        
        var area: Double?
        
        var table: [String : Any]
        
        init() {
            self.originalBoundary = nil
            self.boundary = nil
            self.identity = nil
            self.area = nil
            self.table = [:]
        }
        init(originalBoundary: Rect?, boundary: Rect?, table: [String : Any]) {
            self.originalBoundary = originalBoundary
            self.boundary = boundary
            self.identity = nil
            self.area = nil
            self.table = table
        }
    }
    
    public enum Segment {
        
        case line(Point)

        }
    }
    
    fileprivate var components: [Component]
    
    public var baseTransform : SDTransform = SDTransform(SDTransform.Identity()) {
