/// <summary>
        /// Executes the method <see cref="FluentApiFactory.AssemblyFrom(Type[], string, string, Type, bool?)"/>.
        /// Make sure that you have already called the method <see cref="ScanAssemblyFrom(Type)"/>.
        /// </summary>
        /// <param name="fileName">The physical file name under which the dynamic fluent API assembly will be saved.</param>
        /// <returns></returns>
        /// <exception cref="InvalidOperationException">You must first call one of the Scan methods.</exception>
        public FluentApiFactoryConfig Build(string fileName = null)
        {
            CheckDisposed();
            try
            {
                if (_assemblyTypes == null)
                {
                    ThrowScanRequired();
                }

                _result   = FluentApiFactory.AssemblyFrom(_assemblyTypes, fileName: fileName);
                _executed = true;

                if (!_result.Succeeded)
                {
                    _onErrorHandler?.Invoke(_result.Error);
                }
            }
            catch (Exception ex)
            {
                if (_onErrorHandler == null)
                {
                    throw;
                }
                _onErrorHandler?.Invoke(ex);
            }

            return(this);
        }
        /// <summary>
        /// Reset the last execution configuration except for error handlers, and factory configuration options.
        /// The <see cref="FluentApiFactory"/>'s internal dictionary of previously created types, such as interfaces,
        /// proxies, and fluent API types, are also discarded.
        /// </summary>
        /// <returns></returns>
        public FluentApiFactoryConfig Reset()
        {
            CheckDisposed();
            FluentApiFactory.Reset();

            _result        = null;
            _executed      = false;
            _assemblyTypes = null;

            return(this);
        }
        /// <summary>
        /// Dispose all resources used by the current <see cref="FluentApiFactoryConfig"/>,
        /// including error handlers, and optionally the last execution result.
        /// </summary>
        /// <param name="all">true to also discard the last execution result; otherwise, false.</param>
        /// <returns></returns>
        public FluentApiFactoryConfig ReleaseResources(bool all = false)
        {
            CheckDisposed();
            if (_onErrorHandler != null)
            {
                FluentApiFactory.Error -= _onErrorHandler;
                _onErrorHandler         = null;
            }

            if (_onDeleteHandler != null)
            {
                FluentApiFactory.DeleteFileError -= _onDeleteHandler;
                _onDeleteHandler = null;
            }
            if (all)
            {
                Reset();
            }
            else
            {
                FluentApiFactory.Reset();
            }
            return(this);
        }