public static GameObject LoadSavedObject(SavedObjectV2 save, Transform parent = null)
    {
        ComponentType componenttype = SavedObjectTypeToObjectType[save.GetType()];

        GameObject LoadedObject = null;

        if (componenttype == ComponentType.CustomObject)
        {
            LoadedObject = GetCustomPrefab((SavedCustomObject)save);
        }
        else
        {
            LoadedObject = UnityEngine.Object.Instantiate(Prefabs.ComponentTypeToPrefab(componenttype), parent);
        }

        LoadedObject.transform.localPosition    = save.LocalPosition;
        LoadedObject.transform.localEulerAngles = save.LocalEulerAngles;

        LoadedObject.AddComponent <ObjectInfo>().ComponentType = componenttype;

        switch (componenttype)
        {
        // there is no case for objects with no special data to load

        case ComponentType.CustomObject:
            LoadCustomObject(LoadedObject, (SavedCustomObject)save);
            break;


        case ComponentType.CircuitBoard:
            LoadCircuitBoard(LoadedObject, (SavedCircuitBoard)save);
            break;

        case ComponentType.Wire:
            LoadWire(LoadedObject, (SavedWire)save);
            break;

        case ComponentType.Delayer:
            LoadDelayer(LoadedObject, (SavedDelayer)save);
            break;

        case ComponentType.PanelDisplay:
        case ComponentType.Display:
            LoadDisplay(LoadedObject, (SavedDisplay)save);
            break;

        case ComponentType.Inverter:
            LoadInverter(LoadedObject, (SavedInverter)save);
            break;

        case ComponentType.PanelLabel:
        case ComponentType.Label:
            LoadLabel(LoadedObject, (SavedLabel)save);
            break;

        case ComponentType.PanelSwitch:
        case ComponentType.Switch:     // SWITCH-F*****G-CEPTION
            LoadSwitch(LoadedObject, (SavedSwitch)save);
            break;

        case ComponentType.ThroughBlotter:
        case ComponentType.Blotter:
            LoadBlotter(LoadedObject, (SavedBlotter)save);
            break;

        case ComponentType.Noisemaker:
            LoadNoisemaker(LoadedObject, (SavedNoisemaker)save);
            break;

        case ComponentType.Mount:
            LoadMount(LoadedObject);
            break;
        }

        if (save.CanHaveChildren)
        {
            foreach (SavedObjectV2 child in save.Children)
            {
                LoadSavedObject(child, LoadedObject.transform);
            }
        }

        return(LoadedObject);
    }