public function snapshot(Snapshot $snapshot) { $player_class = $this->players_map->get_class($snapshot->id()); $reflection = new \ReflectionClass($player_class); $parameters = $reflection->getConstructor()->getParameters(); $args = []; foreach ($parameters as $parameter) { $parameter_name = $parameter->getName(); $parameter_contract = $parameter->getClass()->name; if ($parameter_contract === Projection::class) { $args[$parameter_name] = $this->app->make($this->get_implementation_by_interface($player_class)); } elseif ($parameter_contract === Snapshot::class) { $args[$parameter_name] = $snapshot; } elseif ($parameter_contract === Log::class) { $args[$parameter_name] = $this->app->make('EventLog'); } else { $args[$parameter_name] = $this->app->make($parameter_contract); } } return $reflection->newInstanceArgs($args); }
public function save(Snapshot $snapshot) { $this->query()->where('id', $snapshot->id()->serialize())->update($snapshot->serialize()); }