diff --git a/names_values.hpp b/names_values.hpp
index 1e03d51..c33c507 100644
--- a/names_values.hpp
+++ b/names_values.hpp
@@ -33,80 +33,78 @@
  */
 class NamesValues
 {
-    public:
+  public:
+    NamesValues() = default;
+    NamesValues(const NamesValues&) = default;
+    NamesValues& operator=(const NamesValues&) = default;
+    NamesValues(NamesValues&&) = default;
+    NamesValues& operator=(NamesValues&&) = default;
 
-        NamesValues() = default;
-        NamesValues(const NamesValues&) = default;
-        NamesValues& operator=(const NamesValues&) = default;
-        NamesValues(NamesValues&&) = default;
-        NamesValues& operator=(NamesValues&&) = default;
+    /**
+     * Adds a name/value pair to the object
+     *
+     * @param name - the name to add
+     * @param value - the value to add
+     */
+    void add(const std::string& name, uint64_t value)
+    {
+        addDivider();
+        addName(name);
+        addValue(value);
+    }
 
-        /**
-         * Adds a name/value pair to the object
-         *
-         * @param name - the name to add
-         * @param value - the value to add
-         */
-        void add(const std::string& name, uint64_t value)
+    /**
+     * Returns a formatted concatenation of all of the names and
+     * their values.
+     *
+     * @return string - "<name1>=<value1>|<name2>=<value2>..etc"
+     */
+    const std::string& get() const
+    {
+        return all;
+    }
+
+  private:
+    /**
+     * Adds a name to the object
+     *
+     * @param name - the name to add
+     */
+    void addName(const std::string& name)
+    {
+        all += name + '=';
+    }
+
+    /**
+     * Adds a value to the object
+     *
+     * @param value - the value to add
+     */
+    void addValue(uint64_t value)
+    {
+        std::ostringstream stream;
+        stream << "0x" << std::hex << value;
+        all += stream.str();
+    }
+
+    /**
+     * Adds a divider to the summary string to
+     * break up the name/value pairs
+     */
+    void addDivider()
+    {
+        if (!all.empty())
         {
-            addDivider();
-            addName(name);
-            addValue(value);
+            all += '|';
         }
+    }
 
-        /**
-         * Returns a formatted concatenation of all of the names and
-         * their values.
-         *
-         * @return string - "<name1>=<value1>|<name2>=<value2>..etc"
-         */
-        const std::string& get() const
-        {
-            return all;
-        }
-
-    private:
-
-        /**
-         * Adds a name to the object
-         *
-         * @param name - the name to add
-         */
-        void addName(const std::string& name)
-        {
-            all += name + '=';
-        }
-
-        /**
-         * Adds a value to the object
-         *
-         * @param value - the value to add
-         */
-        void addValue(uint64_t value)
-        {
-            std::ostringstream stream;
-            stream << "0x" << std::hex << value;
-            all += stream.str();
-        }
-
-        /**
-         * Adds a divider to the summary string to
-         * break up the name/value pairs
-         */
-        void addDivider()
-        {
-           if (!all.empty())
-           {
-                all += '|';
-           }
-        }
-
-        /**
-         * The string containing all name/value pairs
-         */
-        std::string all;
+    /**
+     * The string containing all name/value pairs
+     */
+    std::string all;
 };
 
-}
-}
-}
+} // namespace util
+} // namespace power
+} // namespace witherspoon
