public StreamCopyToFactory(Stream source, StreamNativeAsyncFactory factory)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            this.source = source;

            readAsync = factory.CreateReadAsyncMethod();
        }
            public ContingentAsyncMethods(Stream stream)
            {
                var factory = new StreamNativeAsyncFactory(stream, false);

                flushAsync = factory.CreateFlushAsyncMethod();
                readAsync  = factory.CreateReadAsyncMethod();
                writeAsync = factory.CreateWriteAsyncMethod();

                var copyToFactory = new StreamCopyToFactory(stream, factory);

                copyTo = copyToFactory.CreateStreamCopyToMethod();
                copyToWithCustomBufferSize = copyToFactory.CreateStreamCopyToWithCustomBufferSizeMethod();
                copyToAsync = copyToFactory.CreateStreamCopyToAsyncMethod();
                copyToAsyncWithCustomBufferSize = copyToFactory.CreateStreamCopyToAsyncWithCustomBufferSizeMethod();
            }