private IDisposable RegisterToEvent(object instance, EventInfo @event, IPublisherRegistrationInterceptor interceptor)
        {
            string topic = interceptor.GetTopicUri(@event);

            IWampTopicProxy topicProxy = mProxy.TopicContainer.GetTopicByUri(topic);

            PublishOptions options = interceptor.GetPublishOptions(@event);

            Delegate createdDelegate;

            Type eventHandlerType = @event.EventHandlerType;

            if (IsPositional(eventHandlerType))
            {
                createdDelegate =
                    mEventHandlerGenerator.CreatePositionalDelegate(eventHandlerType, topicProxy, options);
            }
            else
            {
                createdDelegate =
                    mEventHandlerGenerator.CreateKeywordsDelegate(eventHandlerType, topicProxy, options);
            }

            @event.AddEventHandler(instance, createdDelegate);

            PublisherDisposable disposable =
                new PublisherDisposable(instance,
                                        createdDelegate,
                                        @event,
                                        topic, mProxy.Monitor);

            return(disposable);
        }
        public IDisposable RegisterPublisher(object instance, IPublisherRegistrationInterceptor interceptor)
        {
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }

            Type runtimeType = instance.GetType();

            IEnumerable <Type> typesToExplore = GetTypesToExplore(runtimeType);

            List <IDisposable> disposables = new List <IDisposable>();

            foreach (Type type in typesToExplore)
            {
                foreach (EventInfo @event in type.GetInstanceEvents())
                {
                    if (interceptor.IsPublisherTopic(@event))
                    {
                        IDisposable disposable =
                            RegisterToEvent(instance, @event, interceptor);

                        disposables.Add(disposable);
                    }
                }
            }

            IDisposable result =
                new CompositeDisposable(disposables);

            return(result);
        }
 public IDisposable RegisterPublisher(object instance, IPublisherRegistrationInterceptor interceptor)
 {
     return(mPublisherRegistrar.RegisterPublisher(instance, interceptor));
 }