template <class O>
struct OperationPattern
{
    typedef decltype(((O)nullptr)->GetDeferral()) D;

    OperationPattern(O operation) :
        operation(operation),
        deferral(operation->GetDeferral())
    {
    }

    O Operation() const {
        return operation;
    };
    D Deferral() const {
        return deferral;
    };

    void Dispose()
    {
        deferral->Complete();
    }

    operator Disposable() const
    {
        // make sure to capture state and not 'this'.
        // usage means that 'this' will usualy be destructed
        // immediately
        auto local = deferral;
        return Disposable([local]{
            local->Complete();
        });
    }

private:
    O operation;
    D deferral;
};

template <class O>
OperationPattern<O> make_operation_pattern(O o) 
{ 
    return OperationPattern<O>(std::move(o)); 
}