*/ private ?array $attributeKeys = null; private ?AggregationInterface $aggregation = null; private function __construct() { } public static function create(): self { static $instance; return $instance ??= new self(); } public function withName(string $name): self { $self = clone $this; $self->name = $name; return $self; } public function withDescription(string $description): self { $self = clone $this; $self->description = $description; return $self; } /** * @param list $attributeKeys */ public function withAttributeKeys(array $attributeKeys): self { $self = clone $this; $self->attributeKeys = $attributeKeys; return $self; } public function withAggregation(?AggregationInterface $aggregation): self { $self = clone $this; $self->aggregation = $aggregation; return $self; } public function project(Instrument $instrument): ViewProjection { return new ViewProjection( $this->name ?? $instrument->name, $instrument->unit, $this->description ?? $instrument->description, $this->attributeKeys, $this->aggregation, ); } }