manager: add binding for sd_bus_add_object_manager

Change-Id: I9548b7fd7ce12beab10283b29a05ea31a335b03f
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sdbusplus/bus.hpp b/sdbusplus/bus.hpp
index 0156705..119ae52 100644
--- a/sdbusplus/bus.hpp
+++ b/sdbusplus/bus.hpp
@@ -10,6 +10,7 @@
 
 // Forward declare.
 namespace server { namespace interface { struct interface; } }
+namespace server { namespace manager { struct manager; } }
 
 namespace bus
 {
@@ -166,6 +167,7 @@
     }
 
     friend struct server::interface::interface;
+    friend struct server::manager::manager;
 
     private:
         busp_t get() { return _bus.get(); }
diff --git a/sdbusplus/manager.hpp b/sdbusplus/manager.hpp
new file mode 100644
index 0000000..3513f2a
--- /dev/null
+++ b/sdbusplus/manager.hpp
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <sdbusplus/slot.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace sdbusplus
+{
+
+namespace server
+{
+
+namespace manager
+{
+
+/** @class manager
+ *  @brief Provide a C++ holder for a sd-bus object manager.
+ *
+ *  Wraps sd_bus_add_object_manager so that an sd-bus owned object manager
+ *  can be installed at a path and automatically removed when destructed.
+ */
+struct manager
+{
+        /* Define all of the basic class operations:
+         *     Not allowed:
+         *         - Default constructor to avoid nullptrs.
+         *         - Copy operations due to internal unique_ptr.
+         *     Allowed:
+         *         - Move operations.
+         *         - Destructor.
+         */
+    manager() = delete;
+    manager(const manager&) = delete;
+    manager& operator=(const manager&) = delete;
+    manager(manager&&) = default;
+    manager& operator=(manager&&) = default;
+    ~manager() = default;
+
+    /** @brief Register an object manager at a path.
+     *
+     *  @param[in] bus - The bus to register on.
+     *  @param[in] path - The path to register.
+     */
+    manager(sdbusplus::bus::bus& bus, const char* path) : _slot(nullptr)
+    {
+        sd_bus_slot* slot = nullptr;
+        sd_bus_add_object_manager(bus.get(), &slot, path);
+
+        _slot = decltype(_slot){slot};
+    }
+
+    private:
+        slot::slot _slot;
+
+};
+
+} // namespace manager
+} // namespace server
+} // namespace sdbusplus