/// <summary>
        /// Opens an archive for file reading.
        /// </summary>
        /// <remarks>
        /// The archives are created using class factories within
        /// extension libraries.
        /// </remarks>
        /// <param name="filename">The filename that will be opened</param>
        /// <param name="archiveType">The library that contains the data-handling code</param>
        /// <returns>
        /// If the function succeeds, a valid pointer to an Archive object is returned.
        /// <para/>
        /// If the function fails, an exception is thrown.
        /// </returns>
        public Archive Load(string filename, string archiveType)
        {
            Archive arch = null;

            if (!_archives.TryGetValue(filename, out arch))
            {
                // Search factories
                ArchiveFactory fac = null;
                if (!_factories.TryGetValue(archiveType, out fac))
                {
                    throw ExceptionFactory.CreateFatalException("Cannot find an archive factory to deal with archive of type {0}", archiveType);
                }

                arch = fac.CreateInstance(filename);
                arch.Load();
                _archives.Add(filename, arch);
            }
            return(arch);
        }