public function position($needle)
    {
        self::mustBeString($needle, 'Needle');

        if (is_object($needle)) {
            $needle = "$needle";
        }

        if (empty($needle)) {
            throw new \InvalidArgumentException('Needle must be not empty!');
        }

        $length = mb_strlen($needle, C::ENCODING);
        $offset = 0;

        $a = array();

        while ($offset < $this->int_count) {
            $pos = mb_strpos($this->value, $needle, $offset, C::ENCODING);

            if ($pos !== false) {
                $a[] = new N($pos);
            } else {
                break;
            }

            $offset = $pos + $length;
        }

        return new A($a);
    }