 
 /// **internal use only**
 fileprivate class AbstractPromiseState<Success> {
-  func handleSubscription() {
-  }
-
-  func handleCompletion(
+  var completion: Fallible<Success>? { return nil }
+
+  func subscribe(
+    owner: Future<Success>,
+    handler: inout PromiseHandler<Success>?,
+    executor: Executor,
+    _ block: @escaping (_ completion: Fallible<Success>, _ originalExecutor: Executor) -> Void
+    ) -> AbstractPromiseState<Success> {
+    return self
+  }
+
+  func didSubscribe(
+    executor: Executor,
+    _ block: @escaping (_ completion: Fallible<Success>,
+    _ originalExecutor: Executor) -> Void) {
+  }
+
+  func complete(completion: Fallible<Success>) -> AbstractPromiseState<Success> {
+    return CompletedPromiseState<Success>(completion: completion)
+  }
+
+  func didComplete(
     _ value: Fallible<Success>,
     from originalExecutor: Executor?
     ) -> AbstractPromiseState<Success>? {

    _ completion: Fallible<Success>,
    from originalExecutor: Executor? = nil
    ) -> Bool {
    let completedItem = CompletedPromiseState(value: completion)
    let (oldHead, newHead) = _container.updateHead {
      switch $0 {
      case is InitialPromiseState<Success>:
        return completedItem
      case is SubscribedPromiseState<Success>:
        return completedItem
      case let oldCompletedItem as CompletedPromiseState<Success>:
        return oldCompletedItem
      case .none:
        return completedItem
      default:
        fatalError()
      }
    }
    let didComplete = (completedItem === newHead)
    guard didComplete else { return false }

    var nextItem = oldHead
    while let currentItem = nextItem as? AbstractPromiseState<Success> {
      nextItem = currentItem.handleCompletion(completion, from: originalExecutor)
    }
    _releasePool.drain()



  /// Returns either completion for complete `Promise` or nil otherwise
  override public var completion: Fallible<Success>? {
    return (_container.head as! AbstractPromiseState<Success>).completion
  }

  /// Designated initializer of promise
