private function parser() {

        $full_name = $this->name;

        $full_name = trim(str_replace('  ', ' ', $full_name));
        $full_name = htmlspecialchars_decode(htmlspecialchars($full_name, ENT_QUOTES));

        //before explode, we need to exract salutation
        $full_name = strtolower($full_name);
        foreach ($this->salutations as $salute) {

            // salutation must start from position 0
            // if salutation found but start from > 0 then that they father salutation
            if (strpos($full_name, $salute) !== false && strpos($full_name, $salute) === 0) {
                $this->salutation = $this->fix_case($salute);
                $full_name = str_replace($salute, '', $full_name);
            }
        }

        $full_name = str_replace('  ', ' ', $full_name);
        $full_name = ucwords(strtolower(trim($full_name)));

        // split into words
        $unfiltered_name_parts = explode(' ',$full_name);

        // completely ignore any words in parentheses
        foreach ($unfiltered_name_parts as $word) {
            if ($word{0} != "(")
                $name_parts[] = $word;
        }

        $num_words = sizeof($name_parts);

        $start = 0;
        $end = $num_words;

        // concat the first name
        for ($i=$start; $i < $end-1; $i++) {
            $word = $name_parts[$i];

            // move on to parsing the last name if we find an indicator of a compound last name (Binti, Bin, , Bte, Mohd, Syed etc)
            // we use $i != $start to allow for rare cases where an indicator is actually the first name (like "Syed Cromok")
            if ($this->is_middle($word) && $i != $start)
                break;
            // is it a middle initial or part of their first name?
            // if we start off with an initial, we'll call it the first name
            $this->first .= " ".$this->fix_case($word);
        }

        // check that we have more than 1 word in our string

        if ($end-$start > 1) {
            // concat the last name
            for ($i; $i < $end; $i++) {
                $this->last .= " ".$this->fix_case($name_parts[$i]);
            }
        } else {
            // otherwise, single word strings are assumed to be first names
            $this->first = $this->fix_case($name_parts[$i]);
        }

        $this->first = trim($this->first);
        $this->last = trim($this->last);
    }