private function processValue($section, $value, $config = [])
    {
        // Need to catch Exception in case INI string is not properly formed
        try {
            // Make sure $config is an ArrayObject
            $config = $this->arr($config);
        } catch (StdObjectException $e) {
            $config = $this->arr();
        }

        // Create StringObject and trim invalid characters
        $section = $this->str($section);
        $this->validateSection($section);

        // Handle nested sections, ex: parent.child.property
        if ($section->contains($this->delimiter)) {
            /**
             * Explode section and only take 2 elements
             * First element will be the new array key, and second will be passed for recursive processing
             * Ex: parent.child.property will be split into 'parent' and 'child.property'
             */
            $sections = $section->explode($this->delimiter, 2)->removeFirst($section);
            $localConfig = $config->key($section, [], true);
            $config->key($section, $this->processValue($sections->last()->val(), $value, $localConfig));
        } else {
            // If value is an array, we need to process it's keys
            if ($this->isArray($value)) {
                foreach ($value as $k => $v) {
                    $localConfig = $config->key($section, [], true);
                    $config->key($section, $this->processValue($k, $v, $localConfig));
                }
            } else {
                $config->key($section, $value);
            }
        }

        return $config->val();
    }