public DeferredHandlingSettings([NotNull] IEventHandlingSettings origin, DelayUntil delayUntil)
            : base(origin.Type, origin.Priority)
        {
            deferredAction = ev =>
            {
                if (ev == null)
                {
                    throw new ArgumentNullException("ev");
                }

                if (Type.IsInstanceOfType(ev))
                {
                    var context = InternalEnvironment.DataContextSupervisor.CurrentContext;

                    if (context != null)
                    {
                        EventHandler<FinishedEventArgs> action = null;

                        action = (sender, e) =>
                        {
                            try
                            {
                                // ReSharper disable AccessToModifiedClosure
                                switch (delayUntil)
                                {
                                    case DelayUntil.PreCompleted:
                                        context.BeforeCompleted -= action;
                                        break;
                                    case DelayUntil.Completed:
                                        context.AfterCompleted -= action;
                                        break;
                                    case DelayUntil.Finished:
                                        context.Finished -= action;
                                        break;
                                }

                                if (e.Completed)
                                {
                                    // ReSharper restore AccessToModifiedClosure
                                    origin.Action(ev);
                                }
                            }
                            finally
                            {
                                context = null;
                                action = null;
                            }
                        };

                        switch (delayUntil)
                        {
                            case DelayUntil.PreCompleted:
                                context.BeforeCompleted += action;
                                break;
                            case DelayUntil.Completed:
                                context.AfterCompleted += action;
                                break;
                            case DelayUntil.Finished:
                                context.Finished += action;
                                break;
                        }
                    }
                    else
                    {
                        Trace.TraceWarning("Taijutsu: Source of event is outside of unit of work, event is skipped.");
                    }
                }
            };
        }
        public BatchedHandlingSettings([NotNull] Type type, DelayUntil delayUntil, int priority)
            : base(type, priority)
        {
            this.delayUntil = delayUntil;
            Unique = true;

            batchedAction = ev =>
            {
                if (ev == null)
                {
                    throw new ArgumentNullException("ev");
                }

                if (Type.IsInstanceOfType(ev))
                {
                    var context = InternalEnvironment.DataContextSupervisor.CurrentContext;

                    if (context != null)
                    {
                        var extension = InitializeExtension(context);

                        if (!extension.ContainsKey(this))
                        {
                            extension[this] = new List<object>();
                            EventHandler<FinishedEventArgs> action = null;

                            action = (sender, e) =>
                            {
                                try
                                {
                                    // ReSharper disable AccessToModifiedClosure
                                    switch (delayUntil)
                                    {
                                        case DelayUntil.PreCompleted:
                                            context.BeforeCompleted -= action;
                                            break;
                                        case DelayUntil.Completed:
                                            context.AfterCompleted -= action;
                                            break;
                                        case DelayUntil.Finished:
                                            context.Finished -= action;
                                            break;
                                    }

                                    var events = (List<object>)extension[this];

                                    extension.Remove(this);

                                    // ReSharper restore AccessToModifiedClosure
                                    if (events.Count > 0 && e.Completed)
                                    {
                                        Events.Publish(ResolveConstructor()(events));
                                    }
                                }
                                finally
                                {
                                    context = null;
                                    action = null;
                                    extension = null;
                                }
                            };

                            switch (delayUntil)
                            {
                                case DelayUntil.PreCompleted:
                                    context.BeforeCompleted += action;
                                    break;
                                case DelayUntil.Completed:
                                    context.AfterCompleted += action;
                                    break;
                                case DelayUntil.Finished:
                                    context.Finished += action;
                                    break;
                            }
                        }

                        ((List<object>)extension[this]).Add(ev);
                    }
                    else
                    {
                        Trace.TraceWarning("Taijutsu: Source of event is outside of unit of work, event is skipped.");
                    }
                }
            };
        }