*/ final class Guests implements \ArrayAccess, \Countable, \IteratorAggregate, \Stringable { /** * @param Guest[] $guests */ private function __construct(private array $guests) { } public function count(): int { return count($this->guests); } public function getIterator(): \Traversable { return new \ArrayIterator($this->guests); } public function offsetExists(mixed $offset): bool { return isset($this->guests[$offset]); } public function offsetGet(mixed $offset): mixed { return $this->guests[$offset]; } public function offsetSet(mixed $offset, mixed $value): void { $this->guests[$offset] = $value; } public function offsetUnset(mixed $offset): void { unset($this->guests[$offset]); } public function __toString(): string { // TODO: allow for more than two guests. if (count($this->guests) === 2) { assert($this->guests[1] instanceof Guest); return sprintf('%s %s %s', $this->guests[0]->getName(), t('and'), $this->guests[1]->getName()); } return strval($this->guests[0]->getName()); } /** * @param Guest[] $guests */ public static function new(array $guests): self { return new self($guests); } }