diff --git a/fan_pwm.hpp b/fan_pwm.hpp
index 61c0bf6..e80dde0 100644
--- a/fan_pwm.hpp
+++ b/fan_pwm.hpp
@@ -1,11 +1,11 @@
 #pragma once
 
-#include <memory>
-
 #include "hwmonio.hpp"
 #include "interface.hpp"
 #include "sysfs.hpp"
 
+#include <memory>
+
 namespace hwmon
 {
 
@@ -17,49 +17,43 @@
  */
 class FanPwm : public FanPwmObject
 {
-    public:
-
-        /**
-         * @brief Constructs FanPwm Object
-         *
-         * @param[in] io - HwmonIO
-         * @param[in] devPath - The /sys/devices sysfs path
-         * @param[in] id - The hwmon id
-         * @param[in] bus - Dbus bus object
-         * @param[in] objPath - Dbus object path
-         * @param[in] defer - Dbus object registration defer
-         */
+  public:
+    /**
+     * @brief Constructs FanPwm Object
+     *
+     * @param[in] io - HwmonIO
+     * @param[in] devPath - The /sys/devices sysfs path
+     * @param[in] id - The hwmon id
+     * @param[in] bus - Dbus bus object
+     * @param[in] objPath - Dbus object path
+     * @param[in] defer - Dbus object registration defer
+     */
     FanPwm(std::unique_ptr<hwmonio::HwmonIOInterface> io,
-           const std::string& devPath,
-           const std::string& id,
-           sdbusplus::bus::bus& bus,
-           const char* objPath,
-           bool defer,
-           uint64_t target) : FanPwmObject(bus, objPath, defer),
-                id(id),
-                ioAccess(std::move(io)),
-                devPath(devPath)
-        {
-            FanPwmObject::target(target);
-        }
+           const std::string& devPath, const std::string& id,
+           sdbusplus::bus::bus& bus, const char* objPath, bool defer,
+           uint64_t target) :
+        FanPwmObject(bus, objPath, defer),
+        id(id), ioAccess(std::move(io)), devPath(devPath)
+    {
+        FanPwmObject::target(target);
+    }
 
-        /**
-         * @brief Set the value of target
-         *
-         * @return Value of target
-         */
-        uint64_t target(uint64_t value) override;
+    /**
+     * @brief Set the value of target
+     *
+     * @return Value of target
+     */
+    uint64_t target(uint64_t value) override;
 
-    private:
-        /** @brief hwmon type */
-        static constexpr auto type = "pwm";
-        /** @brief hwmon id */
-        std::string id;
-        /** @brief Hwmon sysfs access. */
-        std::unique_ptr<hwmonio::HwmonIOInterface> ioAccess;
-        /** @brief Physical device path. */
-        std::string devPath;
+  private:
+    /** @brief hwmon type */
+    static constexpr auto type = "pwm";
+    /** @brief hwmon id */
+    std::string id;
+    /** @brief Hwmon sysfs access. */
+    std::unique_ptr<hwmonio::HwmonIOInterface> ioAccess;
+    /** @brief Physical device path. */
+    std::string devPath;
 };
 
 } // namespace hwmon
-
