public UnsubscribeAction Connect(string key, IPipelineSink <T> sink)
        {
            _output.Set(sinks =>
            {
                MessageRouter <T> router;
                if (sinks.TryGetValue(key, out router) == false)
                {
                    router = new MessageRouter <T>();
                    router.Connect(sink);

                    return(new Dictionary <string, MessageRouter <T> >(sinks)
                    {
                        { key, router }
                    });
                }

                var result = new Dictionary <string, MessageRouter <T> >(sinks);

                router = new MessageRouter <T>(router.Sinks);
                router.Connect(sink);
                result[key] = router;

                return(result);
            });

            return(() => Disconnect(key, sink));
        }