protected function valueAccessor($value, $returnNull = false)
    {
        if (Support::isCallable($value)) {
            return $value;
        }

        return function ($item) use ($value, $returnNull) {
            if (is_null($value)) {
                return $returnNull ? null : $item;
            }
            if (Support::isTraversable($item)) {
                return array_key_exists($value, $item) ? $item[$value] : null;
            }
            if (is_object($item) && isset($item->{$value})) {
                return $item->{$value};
            }
            if (is_object($item) && method_exists($item, $value)) {
                return $item->{$value}();
            }
            if (is_object($item) && method_exists($item, 'get' . ucwords($value))) {
                return $item->{'get' . ucwords($value)}();
            }

            return $returnNull ? null : $item;
        };
    }