getPropertyLevels($name); $value = $this->getProperties(); foreach ($levels as $level) { if ($value instanceof IArrayClass) { if (!$value->has($level)) { return false; } $value = $value->get($level); } else { if (!isset($value[$level])) { return false; } $value = $value[$level]; } } return true; } /** * @inheritDoc */ public function getProperty (string $name, $default = null) { if (!$this->hasProperty($name)) { if ($default === null) { throw new UnexpectedValueException('The "' . $name . '" property is not set'); } return $default; } $levels = $this->getPropertyLevels($name); $value = $this->getProperties(); foreach ($levels as $level) { if ($value instanceof IArrayClass) { $value = $value->get($level); } else { $value = $value[$level]; } } return $value; } /** * Provide the multi-level separator * * Reimplements to override * * @return string The separator */ protected function getPropertySeparator (): string { return '/'; } /** * Get array of levels of a property name * * @param string $propertyName The property name * * @return ImmutableArrayClass The property levels */ private function getPropertyLevels (string $propertyName): ImmutableArrayClass { return new ImmutableArrayClass(explode($this->getPropertySeparator(), $propertyName)); } }