public function __construct(array $definition)
{
// Validate the presence of required properties.
foreach (['country_code', 'format'] as $requiredProperty) {
if (empty($definition[$requiredProperty])) {
throw new \InvalidArgumentException(sprintf('Missing required property %s.', $requiredProperty));
}
}
// Add defaults for properties that are allowed to be empty.
$definition += ['locale' => null, 'local_format' => null, 'required_fields' => [], 'uppercase_fields' => [], 'postal_code_pattern' => null, 'postal_code_prefix' => null, 'subdivision_depth' => 0];
AddressField::assertAllExist($definition['required_fields']);
AddressField::assertAllExist($definition['uppercase_fields']);
$this->countryCode = $definition['country_code'];
$this->locale = $definition['locale'];
$this->format = $definition['format'];
$this->localFormat = $definition['local_format'];
$this->requiredFields = $definition['required_fields'];
$this->uppercaseFields = $definition['uppercase_fields'];
$this->subdivisionDepth = $definition['subdivision_depth'];
$usedFields = $this->getUsedFields();
if (in_array(AddressField::ADMINISTRATIVE_AREA, $usedFields)) {
if (isset($definition['administrative_area_type'])) {
AdministrativeAreaType::assertExists($definition['administrative_area_type']);
$this->administrativeAreaType = $definition['administrative_area_type'];
}
}
if (in_array(AddressField::LOCALITY, $usedFields)) {
if (isset($definition['locality_type'])) {
LocalityType::assertExists($definition['locality_type']);
$this->localityType = $definition['locality_type'];
}
}
if (in_array(AddressField::DEPENDENT_LOCALITY, $usedFields)) {
if (isset($definition['dependent_locality_type'])) {
DependentLocalityType::assertExists($definition['dependent_locality_type']);
$this->dependentLocalityType = $definition['dependent_locality_type'];
}
}
if (in_array(AddressField::POSTAL_CODE, $usedFields)) {
if (isset($definition['postal_code_type'])) {
PostalCodeType::assertExists($definition['postal_code_type']);
$this->postalCodeType = $definition['postal_code_type'];
}
$this->postalCodePattern = $definition['postal_code_pattern'];
$this->postalCodePrefix = $definition['postal_code_prefix'];
}
}