/// <summary>
        /// Exports the specified export package.
        /// </summary>
        /// <param name="exportPackage">The export package.</param>
        /// <param name="writer">The writer to which the data is exported to.</param>
        /// <param name="log">The log.</param>
        /// <param name="context">The export context information.</param>
        /// <exception cref="System.ArgumentNullException">exportPackage</exception>
        /// <exception cref="System.Exception"></exception>
        static public void Export(XElement exportPackage, TextWriter writer, Action <int, string> log = null, dynamic context = null)
        {
            if (exportPackage == null)
            {
                throw new ArgumentNullException("exportPackage");
            }

            log = log ?? NullLogger;    // ensure we have a logger of some sort
            log.Info("Export started");

            try {
                var            package      = ExportPackage.Load(exportPackage);
                Type           providerType = Type.GetType(package.ProviderType);
                ExportProvider provider     = providerType != null
                    ? Activator.CreateInstance(providerType) as ExportProvider
                    : null;

                if (provider == null)
                {
                    if (providerType == null)
                    {
                        throw new Exception(string.Format("Provider does not exist. '{0}'", package.ProviderType));
                    }

                    throw new Exception(string.Format("Invalid export provider: '{0}'. ", package.ProviderType));
                }

                provider.Export(package.Instructions, writer, log, context);
                log.Info("Export completed");
            } catch (Exception ex) {
                log.Error(ex.Message);
                log.Info("Export aborted");
                return;
            }
        }