using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;

namespace FLocal.Core {

	public abstract class Config<T> : IDisposable where T : Config<T> {

		private static T _instance = null;

		public static T instance {
			get {
				if(_instance == null) throw new FLocalException("not initialized");
				return _instance;
			}
		}

		private NameValueCollection data;

		public string AppInfo {
			get {
				return data["AppInfo"];
			}
		}

		protected Config(NameValueCollection data) {
			this.data = data;
		}

		protected static void doInit(Func<T> configCreator) {
			if(_instance != null) throw new FLocalException("already initialized");
			lock(typeof(Config<T>)) {
				if(_instance != null) throw new FLocalException("already initialized");
				_instance = configCreator();
			}
		}

		protected static void doReInit(Func<T> configCreator) {
			lock(typeof(Config<T>)) {
				_instance = configCreator();
			}
		}

		public static bool isInitialized {
			get {
				return _instance != null;
			}
		}

		public virtual void Dispose() {
		}

	}
}
