/*----------------------------------------------------------------------------------------*/
        /// <summary>
        /// Executed to build the activation plan.
        /// </summary>
        /// <param name="binding">The binding that points at the type whose activation plan is being released.</param>
        /// <param name="type">The type whose activation plan is being manipulated.</param>
        /// <param name="plan">The activation plan that is being manipulated.</param>
        /// <returns>
        /// A value indicating whether to proceed or interrupt the strategy chain.
        /// </returns>
        public override StrategyResult Build(IBinding binding, Type type, IActivationPlan plan)
        {
            EventInfo[] events = type.GetEvents(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (EventInfo evt in events)
            {
#if !MONO
                PublishAttribute[] attributes = evt.GetAllAttributes <PublishAttribute>();
#else
                PublishAttribute[] attributes = ExtensionsForICustomAttributeProvider.GetAllAttributes <PublishAttribute>(evt);
#endif

                foreach (PublishAttribute attribute in attributes)
                {
                    plan.Directives.Add(new PublicationDirective(attribute.Channel, evt));
                }
            }

            MethodInfo[] methods         = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            var          injectorFactory = binding.Components.Get <IInjectorFactory>();

            foreach (MethodInfo method in methods)
            {
#if !MONO
                SubscribeAttribute[] attributes = method.GetAllAttributes <SubscribeAttribute>();
#else
                SubscribeAttribute[] attributes = ExtensionsForICustomAttributeProvider.GetAllAttributes <SubscribeAttribute>(method);
#endif
                foreach (SubscribeAttribute attribute in attributes)
                {
                    IMethodInjector injector = injectorFactory.GetInjector(method);
                    plan.Directives.Add(new SubscriptionDirective(attribute.Channel, injector, attribute.Thread));
                }
            }

            return(StrategyResult.Proceed);
        }