/// <summary>
        /// Obtains the settings identified by the key <paramref name="key"/>.
        /// </summary>
        /// <typeparam name="T">Represents the type of the target object.</typeparam>
        /// <param name="storeKey">The settings store key.</param>
        /// <returns>A filled instance of the target object.</returns>
        /// <remarks>
        ///     <para>
        /// If the requested type is a <see cref="IDictionary{T, T}"/> and <c>T</c> is <see cref="System.String"/>,
        /// we just return a copy of our internal dictionary.
        /// </para>
        ///     <para>
        /// We try to map the keys found in the source dictionary with properties of the target
        /// object.
        /// </para>
        ///     <para>
        ///         <b>Important: the target object type must provide a parameterless constructor.</b>
        ///     </para>
        /// </remarks>
        public virtual T GetSettingsStore <T>(string storeKey) where T : class, new()
        {
            if (!Stores.ContainsKey(storeKey))
            {
                throw new ArgumentException(string.Format(
                                                "Settings store {0} doesn't exist", storeKey), "storeKey");
            }

            T result = null;

            try
            {
                result = serializer.CreateObject <T>(Stores[storeKey].Settings);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format(
                                                   "Unable to cast settings from settings store {0} to type {1}:\r\n{2}",
                                                   storeKey, typeof(T), ex.ToFormattedString()));
            }

            return(result);
        }