         self.completion = completion
     }
     
-    private func dispose() {
-        disposable?.dispose()
-    }
-    
     public func start() {
-        disposable = {
-            timer(interval, onScheduler: QueueScheduler.mainQueueScheduler)
-                .on(disposed: { [weak self] in
-                        self?.completion?()
-                    },
-                    next: { [weak self] in
-                        guard let _self = self else { return }
-                        
-                        let overTimeInterval = $0.timeIntervalSinceDate(_self.startTime)
-                        let leftTimeInterval = fabs(ceil(_self.duration - overTimeInterval))
-                        _self.next?(leftTimeInterval)
-                        if leftTimeInterval <= 0 {
-                            _self.dispose()
-                        }
-                    })
-                .start()
-            }()
+        disposable = timer(interval, onScheduler: QueueScheduler.mainQueueScheduler).on(
+            disposed: {
+                self.completion()
+            },
+            next: {
+                let overTimeInterval = $0.timeIntervalSinceDate(self.startTime)
+                let leftTimeInterval = fabs(ceil(self.duration - overTimeInterval))
+                self.next(leftTimeInterval)
+                if leftTimeInterval <= 0 {
+                    self.disposable?.dispose()
+                }
+            }
+        ).start()
     }
     
     deinit {
         debugPrint("CountDownTimerWrapper: \(__FUNCTION__)")
     }
-}
-
-public func countDownTimerAction(
-    startTime: NSDate = NSDate(),
-    interval: NSTimeInterval = 1,
-    duration: NSTimeInterval = 60,
-    next: ((NSTimeInterval) -> ())? = nil,
-    completion: (() -> ())? = nil)
-{
-    CountDownTimerWrapper(
-        startTime: startTime,
-        interval: interval,
-        duration: duration,
-        next: next,
-        completion: completion
-    ).start()
 }
 
 // MARK: - MutableProperty


// MARK: - Timer

final public class CountDownTimerWrapper {
    private let startTime: NSDate
    private let interval: NSTimeInterval
    private let duration: NSTimeInterval
    private var next: ((NSTimeInterval) -> ())? = nil
    private var completion: (() -> ())? = nil
    
    private var disposable: Disposable?
    

        startTime: NSDate = NSDate(),
        interval: NSTimeInterval = 1,
        duration: NSTimeInterval = 60,
        next: ((NSTimeInterval) -> ()),
        completion: (() -> ()))
    {
        self.startTime = startTime
        self.interval = interval
