public void Subscribe(object subscriber, Action <IConstraintinfoBuilder> buildConstraints)
        {
            base.Subscribe(subscriber);
            if (eventProxy != null)
            {
                List <IConstraintInfo> constraintInfos = new List <IConstraintInfo>();
                if (buildConstraints != null)
                {
                    var builder = new ConstraintinfoBuilder(constraintInfos, subscriptionStore);
                    buildConstraints(builder);
                }

                CheckSubscriberConstraints(constraintInfos);

                subscriptionStore.AddConstraints(subscriber, constraintInfos);
                var proxyEvents = GetProxyEventTypes(subscriber);

                var subscriptions = from pe in proxyEvents
                                    join ci in constraintInfos on pe equals ci.GetType().GetGenericArguments()[0] into eci
                                    from ciOuter in eci.DefaultIfEmpty()
                                    select new Subscription(pe, ciOuter != null ? ciOuter.GetConstraint() : null, ciOuter.GetConstraintId());

                var actualSubscriptions = subscriptionStore.GetActualSubscriptions(subscriptions.ToList());

                eventProxy.Subscribe(actualSubscriptions);
            }
        }