      - SeeAlso: Has parity with static method
      */
     @discardableResult
-    public func background(after seconds: Double? = nil, chainingBlock: @convention(block) () -> Swift.Void) -> Async {
+    public func background<O>(after seconds: Double? = nil, _ chainingBlock: (Out) -> O) -> AsyncBlock<Out, O> {
         return chain(after: seconds, block: chainingBlock, queue: .background)
     }
 

     - SeeAlso: Has parity with static method
     */
    @discardableResult
    public func custom(queue: DispatchQueue, after seconds: Double? = nil, chainingBlock: @convention(block) () -> Swift.Void) -> Async {
        return chain(after: seconds, block: chainingBlock, queue: .custom(queue: queue))
    }



     - SeeAlso: dispatch_block_notify, dispatch_block_create
     */

    private func chain<O>(after seconds: Double? = nil, block chainingBlock: (Out) -> O, queue: GCD) -> AsyncBlock<Out, O> {
        let reference = Reference<O>()
        let dispatchWorkItem = DispatchWorkItem(block: {
            reference.value = chainingBlock(self.output.value!)
        })

        if let seconds = seconds {
            block.notify(queue: DispatchQueue.main) {
