# SaveState API Flow
## Initialization
### SaveStateManager
**`class CPGSAVESTATE_API UCPGSaveStateManager : public UActorComponent`**
* Must be component of `AGameState`
* `APGameState` creates and attaches this in its constructor, and marks it as Replicated
* `APGameMode` blocks match state in `PostInitializeComponents` via `RequestBlockMatchState` until `SaveStateManager` is ready -- listens for Promise on `APGameState`
### SaveStateLocalSystem
**`class CPGSAVESTATE_API UCPGSaveStateLocalSystem : public ULocalPlayerSubsystem`**
* Automatically constructed by Unreal
## Load
1. `AAPGameState::PostInitializeComponents()` ->
* `SaveStateManagerComponent->RestoreMatchSaveState(...)` ->
* `UCPGSaveStateLocalSystem::LoadMatch(...)` ->
* `UGameplayStatics::LoadGameFromSlot`
* `UCPGSaveStateFunctionLibrary::DeserializeObject(...)`
Note: this happens before the match starts, before `BeginPlay`.
## Save
1. `UCPGSaveStateManager::UpdateLatestSnapshot` ->
* `UCPGSaveStateFunctionLibrary::SerializeObject(...)`
* (Replicate `LatestSaveState`) ->
* `UCPGSaveStateManager::OnLatestSaveStateChanged()` ->
* `UCPGSaveStateLocalSystem::SaveSnapshot(...)` ->
* `UGameplayStatics::SaveGameToSlot(...)`