$fields * @param list $known_fields */ public function __construct( private readonly array $fields, array $known_fields ) { $unknown_fields = array_diff( array_keys( $fields ), $known_fields ); if ( array() !== $unknown_fields ) { throw SettingRefusal::WrongShape->exception(); } } public function value_or( string $field_name, mixed $saved_value ): mixed { return array_key_exists( $field_name, $this->fields ) ? $this->fields[ $field_name ] : $saved_value; } /** @param list $known_fields */ public function group( string $group_name, array $known_fields ): self { $group_fields = $this->value_or( $group_name, array() ); if ( ! is_array( $group_fields ) ) { throw SettingRefusal::WrongShape->exception(); } return new self( $group_fields, $known_fields ); } }