     private func commonInit() {
         backgroundColor = UIColor.clear
         
-        // Add the arcLayer to the view's layer's sublayers
-        layer.addSublayer(arcLayer)
+        // Add the shapeLayer to the view's layer's sublayers
+        layer.addSublayer(shapeLayer)
     }
     
     // MARK: - Functions
 
     private func updateView() {
-        let arcPath = UIBezierPath(
-            arcCenter: CGPoint(x: bounds.midX, y: bounds.midY),
-            radius: min(bounds.midX, bounds.midY),
-            startAngle: start * 2 * .pi,
-            endAngle: end * 2 * .pi,
-            clockwise: start < end
-        )
-        arcLayer.path = arcPath.cgPath
-        arcLayer.fillColor = fillColor.cgColor
-        arcLayer.strokeColor = strokeColor.cgColor
-        arcLayer.lineWidth = lineWidth
+        shapeLayer.path = bezierPath.cgPath
+        shapeLayer.fillColor = fillColor.cgColor
+        shapeLayer.strokeColor = strokeColor.cgColor
+        shapeLayer.lineWidth = lineWidth
         
         // Don't draw the arc initially
-        arcLayer.strokeEnd = 0.0
+        shapeLayer.strokeEnd = 0.0
     }
     
-    func animate() {
-        
+    open func animate() {
         updateView()
         
-        // Animate the strokeEnd property of the arcLayer.
+        // Animate the strokeEnd property of the shapeLayer.
         let animation = CABasicAnimation(keyPath: "strokeEnd")
         
         animation.duration = duration

        }
    }
    
    // MARK: - Enums

    enum Curve: Int {
        case linear = 0
        case easeIn
        case easeOut
        case easeInEaseOut
        
        var mediaTimingFunctionString: String {
            switch self {
            case .linear: return kCAMediaTimingFunctionLinear
            case .easeIn: return kCAMediaTimingFunctionEaseIn
            case .easeOut: return kCAMediaTimingFunctionEaseOut
            case .easeInEaseOut: return kCAMediaTimingFunctionEaseInEaseOut
            }
        }
        
        var mediaTimingFunction: CAMediaTimingFunction {
            return CAMediaTimingFunction(name: mediaTimingFunctionString)
        }
        
    }
    
    // MARK: - Variables

    var curve: Curve = .linear
    let arcLayer = CAShapeLayer()
    
    // MARK: - Init
    

        commonInit()
    }
    
    public required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
