         let secondString = seconds < 10 ? "0" + seconds.description : seconds.description
         return minutes.description + ":" + secondString
     }
+
+    // MARK: Private methods
+    @objc private func timerFired(_ timer: Timer) {
+        elapsedTime += fireInterval
+
+        if elapsedTime < totalTime {
+            setNeedsDisplay()
+
+            let computedCounterValue = beginingValue - Int(elapsedTime / interval)
+            if computedCounterValue != currentCounterValue {
+                currentCounterValue = computedCounterValue
+            }
+        } else {
+            end()
+        }
+    }
 }

    public var useMinutesAndSecondsRepresentation = false

    private var timer: Timer?
    private var totalTime: TimeInterval = 1
    private var elapsedTime: TimeInterval = 0
    private let fireInterval: TimeInterval = 0.01 // ~60 FPS

    private lazy var counterLabel: UILabel = {

     *   - interval: Interval between reducing the counter(1 second by default)
     */
    public func start(beginingValue: Int, interval: TimeInterval = 1) {
        self.beginingValue = beginingValue
        self.interval = interval

        totalTime = TimeInterval(beginingValue) * interval
        elapsedTime = 0
        currentCounterValue = beginingValue

        timer?.invalidate()
        timer = Timer(timeInterval: fireInterval, target: self, selector: #selector(SRCountdownTimer.timerFired(_:)), userInfo: nil, repeats: true)

        RunLoop.main.add(timer!, forMode: .commonModes)

        delegate?.timerDidStart?()
