/// <summary>
        /// Creating a new Object Pool from script. Returns null, if no pool was created.
        /// </summary>
        /// <param name="PrefabToSpawn">The Prefab to spawn. Must have a JustSaveRuntimeId-component</param>
        /// <param name="PrefabId">A prefab id. Should be unique among your other object-pooling-ids</param>
        /// <param name="BasePoolSize">The base size to which the pool should be filled</param>
        /// <param name="Mode">How the pool should operate if you want to spawn something and the pool is empty.</param>
        /// <param name="NotifyToDespawn">How many objects ahead a pool object will be notified to despawn itself (JSOnNeeded is called)</param>
        /// <returns></returns>
        public ObjectPool CreateObjectPool(GameObject PrefabToSpawn, string PrefabId, int BasePoolSize, PoolingMode Mode, int NotifyToDespawn)
        {
            if (BasePoolSize < 0 || PrefabId == null || PrefabId == "")
            {
                return(null);
            }
            GameObject newPool          = new GameObject("ObjectPoolFor" + PrefabToSpawn, typeof(ObjectPool));
            ObjectPool newPoolComponent = newPool.GetComponent <ObjectPool>();

            newPoolComponent.SpawnPrefabId = PrefabId;
            JustSaveRuntimeId SavablePrefabToSpawn = PrefabToSpawn.GetComponent <JustSaveRuntimeId>();

            if (SavablePrefabToSpawn == null)
            {
                return(null);
            }
            newPoolComponent.SpawnPrefab  = SavablePrefabToSpawn;
            newPoolComponent.BasePoolSize = BasePoolSize;
            newPoolComponent.SetPoolingMode(Mode);
            newPoolComponent.NotifyToDespawn = NotifyToDespawn <= BasePoolSize ? NotifyToDespawn : BasePoolSize;
            myObjectPoolingManager.RegisterObjectPool(PrefabId, newPoolComponent);
            return(newPoolComponent);
        }
        /// <summary>
        /// Interprets a given save and applies the data to the Application
        /// </summary>
        /// <param name="source">The save to interpret</param>
        /// <returns>True if the method reached the end of the calculation without fatal errors</returns>
        public bool InterpretSave(Save source)
        {
            List <int> arrayList = new List <int>();
            //getting references to spawning and autosaves
            JSDictionary <JSSerializable> Runtime = source.Runtime;
            JSDictionary <JSSerializable> Static  = source.Static;

            //use this dictionary to remember once scanned classes for later use
            Dictionary <Type, FieldInfo[]> RememberedFields = new Dictionary <Type, FieldInfo[]>();

            //preparing references and despawning runtime objects
            JustSaveId[]           JSManagedObjects      = UnityEngine.Object.FindObjectsOfType <JustSaveId>();
            List <JustSaveSceneId> JSManagedSceneObjects = new List <JustSaveSceneId>();

            foreach (JustSaveId JustSaveManagedObject in JSManagedObjects)
            {
                if (JustSaveManagedObject is JustSaveRuntimeId)
                {
                    ((JustSaveRuntimeId)JustSaveManagedObject).Despawn(); //despawns every runtime object
                }
                else
                {
                    JSManagedSceneObjects.Add((JustSaveSceneId)JustSaveManagedObject); //saves every scene object reference
                }
            }
            if (Dbug.Is(DebugMode.DEBUG))
            {
                Debug.Log("Save Interpreter despawned old runtime objects");
            }

            //loading scene objects
            foreach (JustSaveSceneId IdObj in JSManagedSceneObjects)
            {
                SyncObject(source, false, IdObj, RememberedFields);
            }

            if (Dbug.Is(DebugMode.DEBUG))
            {
                Debug.Log("Save Interpreter synced scene objects");
            }


            //iterating through spawned objects
            string[] idInfo = new string[2];
            foreach (Tuple <String, JSSerializable> RuntimeObjectInfo in Runtime.GetValuePairs())
            {
                idInfo = RuntimeObjectInfo.Item1.Split('_');
                GameObject        spawnedPrefab = JustSaveManager.Instance.Spawn(idInfo[0], Vector3.zero);
                JustSaveRuntimeId spawnedIdObj  = spawnedPrefab.GetComponent <JustSaveRuntimeId>();
                spawnedIdObj.SetId(Guid.Parse(idInfo[1]));
                SyncObject(source, true, spawnedPrefab.GetComponent <JustSaveRuntimeId>(), RememberedFields);
            }


            if (Dbug.Is(DebugMode.DEBUG))
            {
                Debug.Log("Save Interpreter spawned and synced runtime objects");
                Debug.Log("Save Interpreter finished loading Save");
            }

            return(true);
        }