diff --git a/src/main/java/org/apache/commons/text/names/HumanNameParser.java b/src/main/java/org/apache/commons/text/names/HumanNameParser.java
index a29e375..b5c0aa3 100644
--- a/src/main/java/org/apache/commons/text/names/HumanNameParser.java
+++ b/src/main/java/org/apache/commons/text/names/HumanNameParser.java
@@ -100,6 +100,7 @@
         Objects.requireNonNull(name, "Parameter 'name' must not be null.");
 
         NameString nameString = new NameString(name);
+        // TODO compile regexes only once when the parser is created
         String suffixes = StringUtils.join(this.suffixes, "\\.*|") + "\\.*";
         String prefixes = StringUtils.join(this.prefixes, " |") + " ";
 
@@ -132,11 +133,11 @@
         // get the first name
         String first = nameString.chopWithRegex(firstRegex, 0);
         if (StringUtils.isBlank(first)) {
-            throw new NameParseException("Couldn't find a first name in '{" + nameString.getStr() + "}'");
+            throw new NameParseException("Couldn't find a first name in '{" + nameString.getWrappedString() + "}'");
         }
 
         // if anything's left, that's the middle name
-        String middle = nameString.getStr();
+        String middle = nameString.getWrappedString();
         
         return new Name(leadingInit, first, nickname, middle, last, suffix);
     }
diff --git a/src/main/java/org/apache/commons/text/names/NameString.java b/src/main/java/org/apache/commons/text/names/NameString.java
index 8f606f2..54e2753 100644
--- a/src/main/java/org/apache/commons/text/names/NameString.java
+++ b/src/main/java/org/apache/commons/text/names/NameString.java
@@ -37,30 +37,20 @@
      *
      * @param str encapsulated string.
      */
-    public NameString(String str) {
+    NameString(String str) {
         this.str = str;
     }
 
     /**
-     * Gets the encapsulated string.
+     * Gets the wrapped string.
      *
-     * @return encapsulated string
+     * @return wrapped string
      */
-    public String getStr() {
+    String getWrappedString() {
         return str;
     }
 
     /**
-     * Sets the encapsulated string value.
-     *
-     * @param str string value
-     */
-    public void setStr(String str) {
-        this.str = str;
-        this.norm();
-    }
-
-    /**
      * Uses a regex to chop off and return part of the namestring.
      * There are two parts: first, it returns the matched substring,
      * and then it removes that substring from the encapsulated
@@ -70,7 +60,7 @@
      * @param submatchIndex which of the parenthesized submatches to use
      * @return the part of the namestring that got chopped off
      */
-    public String chopWithRegex(String regex, int submatchIndex) {
+    String chopWithRegex(String regex, int submatchIndex) {
         String chopped = "";
         Pattern pattern = Pattern.compile(regex);
         Matcher matcher = pattern.matcher(this.str);
@@ -106,7 +96,7 @@
      * @param flipAroundChar the character(s) demarcating the two halves you want to flip.
      * @throws NameParseException if a regex fails or a condition is not expected
      */
-    public void flip(String flipAroundChar) {
+    void flip(String flipAroundChar) {
         String[] parts = this.str.split(flipAroundChar);
         if (parts != null) {
             if (parts.length == 2) {
@@ -125,7 +115,7 @@
      * <p>Strips whitespace chars from ends, strips redundant whitespace, converts
      * whitespace chars to " ".</p>
      */
-    public void norm() {
+    private void norm() {
         this.str = this.str.trim();
         this.str = this.str.replaceAll("\\s+", " ");
         this.str = this.str.replaceAll(",$", " ");
diff --git a/src/test/java/org/apache/commons/text/names/NameStringTest.java b/src/test/java/org/apache/commons/text/names/NameStringTest.java
index 494c70b..e087579 100644
--- a/src/test/java/org/apache/commons/text/names/NameStringTest.java
+++ b/src/test/java/org/apache/commons/text/names/NameStringTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.commons.text.names;
 
-import static org.junit.Assert.assertEquals;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertThat;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -35,70 +36,42 @@
     }
 
     @Test
-    public void testSetStrRemovesWhitespaceAtEnds() {
-        nameString.setStr("    Björn O'Malley \r\n");
-        assertEquals(
-            "Björn O'Malley",
-            nameString.getStr()
-        );
+    public void testChopWithRegexReturnsChoppedSubstring() {
+        NameString nameString = new NameString("Björn O'Malley");
+
+        assertThat(nameString.chopWithRegex("(^([^ ]+))(.+)", 1), equalTo("Björn"));
     }
 
     @Test
-    public void testSetStrRemovesRedudentantWhitespace(){
-        nameString.setStr(" Björn    O'Malley");
-        assertEquals(
-            "Björn O'Malley",
-            nameString.getStr()
-        );
-    }
-
-    @Test
-    public void testChopWithRegexReturnsChoppedSubstring(){
-        nameString.setStr("Björn O'Malley");
-        assertEquals(
-            "Björn",
-            nameString.chopWithRegex("(^([^ ]+))(.+)", 1)
-        );
-    }
-
-    @Test
-    public void testChopWithRegexChopsStartOffNameStr(){
-        nameString.setStr("Björn O'Malley");
+    public void testChopWithRegexChopsStartOffNameStr() {
+        NameString nameString = new NameString("Björn O'Malley");
         nameString.chopWithRegex("(^[^ ]+)", 0);
-        assertEquals(
-                "O'Malley",
-            nameString.getStr()
-        );
+
+        assertThat(nameString.getWrappedString(), equalTo("O'Malley"));
     }
 
     @Test
-    public void testChopWithRegexChopsEndOffNameStr(){
-        nameString.setStr("Björn O'Malley");
+    public void testChopWithRegexChopsEndOffNameStr() {
+        NameString nameString = new NameString("Björn O'Malley");
         nameString.chopWithRegex("( (.+)$)", 1);
-        assertEquals(
-            "Björn",
-            nameString.getStr()
-        );
+
+        assertThat(nameString.getWrappedString(), equalTo("Björn"));
     }
 
     @Test
-    public void testChopWithRegexChopsMiddleFromNameStr(){
-        nameString.setStr("Björn 'Bill' O'Malley");
+    public void testChopWithRegexChopsMiddleFromNameStr() {
+        NameString nameString = new NameString("Björn 'Bill' O'Malley");
         nameString.chopWithRegex("( '[^']+' )", 0);
-        assertEquals(
-            "Björn O'Malley",
-            nameString.getStr()
-        );
+
+        assertThat(nameString.getWrappedString(), equalTo("Björn O'Malley"));
     }
 
     @Test
     public void testFlip() {
-        nameString.setStr("O'Malley, Björn");
+        NameString nameString = new NameString("O'Malley, Björn");
         nameString.flip(",");
-        assertEquals(
-            "Björn O'Malley",
-            nameString.getStr()
-        );
+
+        assertThat(nameString.getWrappedString(), equalTo("Björn O'Malley"));
     }
 
 }
