protected static function getValue($item, $index, $ignore = false, &$err = null)
    {
        $err = null;
        
        if (empty($index)) return $item;
        
        $key = array_shift($index);
        
        if ((is_array($item) || $item instanceof \Traversable) && isset($item[$key])) {
            return static::getValue($item[$key], $index, $ignore, $err);
        }
        
        if (is_object($item) && isset($item->$key)) {
            return static::getValue($item->$key, $index, $ignore, $err);
        }
        
        if ((!is_object($item) && !is_array($item)) || !$ignore) {
            $err = (object)['var' => isset($item) ? gettype($item) : null, 'incomplete' => count($index) + 1];
        }
        
        return null;
    }