*/ final class Guests implements \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 __toString(): string { // TODO: allow for more than two guests. if ($this->count() === 2) { assert($this->get(0) instanceof Guest); return sprintf('%s %s %s', $this->get(0)->getName(), t('and'), $this->get(1)->getName()); } return strval($this->get(0)->getName()); } /** * @param Guest[] $guests */ public static function new(array $guests): self { return new self($guests); } private function get(int $offset): ?Guest { return $this->guests[$offset]; } }