     func update(_ t: CGFloat) -> CGFloat
 }
 
-open class UILabelCounterLinear: UILabelCounter {
-    open func update(_ t: CGFloat) -> CGFloat {
+public class UILabelCounterLinear: UILabelCounter {
+    public func update(_ t: CGFloat) -> CGFloat {
         return t
     }
 }
 
-open class UILabelCounterEaseIn: UILabelCounter {
-    open func update(_ t: CGFloat) -> CGFloat {
+public class UILabelCounterEaseIn: UILabelCounter {
+    public func update(_ t: CGFloat) -> CGFloat {
         return CGFloat(powf(Float(t), kUILabelCounterRate))
     }
 }
 
-open class UILabelCounterEaseOut: UILabelCounter {
-    open func update(_ t: CGFloat) -> CGFloat {
+public class UILabelCounterEaseOut: UILabelCounter {
+    public func update(_ t: CGFloat) -> CGFloat {
         return CGFloat(1.0 - powf(Float(1.0 - t), kUILabelCounterRate))
     }
 }
 
-open class UILabelCounterEaseInOut: UILabelCounter {
-    open func update(_ t: CGFloat) -> CGFloat {
+public class UILabelCounterEaseInOut: UILabelCounter {
+    public func update(_ t: CGFloat) -> CGFloat {
         let newt: CGFloat = 2 * t
         if newt < 1 {
             return CGFloat(0.5 * powf (Float(newt), kUILabelCounterRate))

    fileprivate var timer: CADisplayLink?
    fileprivate var counter: UILabelCounter = UILabelCounterLinear()

    open func countFrom(_ startValue: CGFloat, to endValue: CGFloat) {
        self.countFrom(startValue, to: endValue, withDuration: self.animationDuration)
    }

    open func countFrom(_ startValue: CGFloat, to endValue: CGFloat, withDuration duration: TimeInterval) {
        self.startingValue = startValue
        self.destinationValue = endValue


        return self.startingValue + updateVal * (self.destinationValue - self.startingValue)
    }

    public func updateValue(_ timer: Timer) {
        // update progress
        let now = Date.timeIntervalSinceReferenceDate
        self.progress = self.progress + now - self.lastUpdate
