using UnityEngine;

namespace AlmostEngine
{

		/// <summary>
		/// Use the singleton to manage persistent data between scenes.
		/// </summary>
		public abstract class Singleton<T> : MonoBehaviour where T : MonoBehaviour
		{
				public static T m_Instance;

				/// <summary>
				/// Create the singleton instance if needed and call OnSingletonAwake().
				/// </summary>
				private void Awake ()
				{
						if (m_Instance == null) {
								//If I am the first instance, make me the Singleton
								m_Instance = this as T;

								if (transform.parent == null) {
										DontDestroyOnLoad (this.gameObject);
								}
						} else {
								//If a Singleton already exists and you find
								//another reference in scene, destroy it!
								if (this != m_Instance) {
										DestroyImmediate (this.gameObject);
								}
								return;
						}

						OnSingletonAwake ();
				}

				void OnDestroy ()
				{
						if (m_Instance == this) {
								m_Instance = null;
						}
				}

				/// <summary>
				/// This method is called just after the singleton construction.
				/// Override it to perform the initial setup.
				/// </summary>
				protected virtual void OnSingletonAwake ()
				{
				}
		}

}