$occupied_by_slot Slot number => occupant. */ public static function from_occupied( array $occupied_by_slot ): self { return new self( $occupied_by_slot[1] ?? null, $occupied_by_slot[2] ?? null, $occupied_by_slot[3] ?? null, $occupied_by_slot[4] ?? null, $occupied_by_slot[5] ?? null, $occupied_by_slot[6] ?? null, $occupied_by_slot[7] ?? null ); } /** * Bind the seven named service fields. * * @param Service|null $service_1 First service field. * @param Service|null $service_2 Second service field. * @param Service|null $service_3 Third service field. * @param Service|null $service_4 Fourth service field. * @param Service|null $service_5 Fifth service field. * @param Service|null $service_6 Sixth service field. * @param Service|null $service_7 Seventh service field. */ public function __construct( private ?Service $service_1 = null, private ?Service $service_2 = null, private ?Service $service_3 = null, private ?Service $service_4 = null, private ?Service $service_5 = null, private ?Service $service_6 = null, private ?Service $service_7 = null, ) {} /** * Occupy the first empty named field. * * @param Service $service Incoming service. * @return int Slot number 1–7. * * @throws EditionLimitReached When service_1 … service_7 are all set. */ public function place( Service $service ): int { if ( null === $this->service_1 ) { $this->service_1 = $service; return 1; } if ( null === $this->service_2 ) { $this->service_2 = $service; return 2; } if ( null === $this->service_3 ) { $this->service_3 = $service; return 3; } if ( null === $this->service_4 ) { $this->service_4 = $service; return 4; } if ( null === $this->service_5 ) { $this->service_5 = $service; return 5; } if ( null === $this->service_6 ) { $this->service_6 = $service; return 6; } if ( null === $this->service_7 ) { $this->service_7 = $service; return 7; } throw new EditionLimitReached( EditionDimension::Service, 7 ); } }