final protected function populateObject(array $data = []): TelegramTypes
    {
        foreach ($data as $key => $value) {
            $candidateKey = null;
            if (\is_array($value)) {
                $this->logger->debug('Array detected, mapping subobjects for key', ['key' => $key]);
                $candidateKey = $this->mapSubObjects($key, $value);
            }

            if (!empty($candidateKey)) {
                if ($candidateKey instanceof CustomType) {
                    $this->logger->debug('Done with mapping, injecting custom data type to class', ['key' => $key]);
                    $this->$key = $candidateKey->data;
                } else {
                    $this->logger->debug('Done with mapping, injecting native data type to class', ['key' => $key]);
                    $this->$key = $candidateKey;
                }
            } else {
                $this->logger->debug('Performing direct assign for key', ['key' => $key]);
                $this->$key = $value;
            }
        }

        return $this;
    }