Exit() private method

Invokes the Exited event if this is the outermost ModelEventScope.
private Exit ( ) : void
return void
        /// <summary>
        /// Performs a set of previous changes, performs the specified operation, and records new changes that
        /// occur as a result of the previous changes and the specified operation.
        /// </summary>
        /// <param name="operation"></param>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public ModelTransaction Perform(Action operation, ModelTransaction transaction)
        {
            // Create an event scope to track changes that occur as a result of applying previous changes
            ModelEventScope eventScope = new ModelEventScope();

            try
            {
                // Perform previous changes
                Perform();

                // Return the new changes that occurred while applying the previous changes
                return(Chain(transaction).Record(() =>
                {
                    // Allow model subscribers to be notified of the previous changes
                    eventScope.Exit();

                    // Clear the reference to the event scope to ensure it is not disposed twice
                    eventScope = null;

                    // Perform the specified operation
                    if (operation != null)
                    {
                        operation();
                    }
                }));
            }
            catch (Exception actionException)
            {
                try
                {
                    if (eventScope != null)
                    {
                        eventScope.Exit();
                    }
                }
                catch (Exception disposalException)
                {
                    throw new ModelEventScope.ScopeException(disposalException, actionException);
                }
                throw;
            }
        }