Use std::any

Replace holder types with std::any.

Change-Id: I0cd8c2804ad4bff79a0cfe93589e699afb095e5f
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/manager.hpp b/manager.hpp
index 9d83ee8..7127ec5 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -36,18 +36,13 @@
 template <typename T>
 struct MakeInterface
 {
-    static std::unique_ptr<details::holder::Base> make(
+    static any_ns::any make(
         sdbusplus::bus::bus& bus,
         const char* path,
         const Interface& props)
     {
         // TODO: pass props to import constructor...
-        using HolderType = holder::Holder<std::unique_ptr<T>>;
-        return HolderType::template make_unique<HolderType>(
-            std::forward<std::unique_ptr<T>>(
-                std::make_unique<T>(
-                    std::forward<decltype(bus)>(bus),
-                    std::forward<decltype(path)>(path))));
+        return any_ns::any(std::make_shared<T>(bus, path));
     }
 };
 } // namespace details
@@ -128,8 +123,7 @@
         decltype(auto) invokeMethod(const char* path, const char* interface,
                                     U&& member, Args&& ...args)
         {
-            auto& holder = getInterface<std::unique_ptr<T>>(path, interface);
-            auto& iface = *holder.get();
+            auto& iface = getInterface<T>(path, interface);
             return (iface.*member)(std::forward<Args>(args)...);
         }
 
@@ -142,8 +136,7 @@
         using SigArg = SigArgs::value_type::element_type;
 
     private:
-        using HolderPtr = std::unique_ptr<details::holder::Base>;
-        using InterfaceComposite = std::map<std::string, HolderPtr>;
+        using InterfaceComposite = std::map<std::string, any_ns::any>;
         using ObjectReferences = std::map<std::string, InterfaceComposite>;
         using Events = std::vector<EventInfo>;
 
@@ -165,9 +158,9 @@
          *
          *  @returns A weak reference to the holder instance.
          */
-        details::holder::Base& getInterfaceHolder(
+        const any_ns::any& getInterfaceHolder(
             const char*, const char*) const;
-        details::holder::Base& getInterfaceHolder(
+        any_ns::any& getInterfaceHolder(
             const char*, const char*);
 
         /** @brief Provides weak references to interface holders.
@@ -184,15 +177,13 @@
         auto& getInterface(const char* path, const char* interface)
         {
             auto& holder = getInterfaceHolder(path, interface);
-            return static_cast <
-                   details::holder::Holder<T>& >(holder);
+            return *any_ns::any_cast<std::shared_ptr<T> &>(holder);
         }
         template<typename T>
         auto& getInterface(const char* path, const char* interface) const
         {
             auto& holder = getInterfaceHolder(path, interface);
-            return static_cast <
-                   const details::holder::Holder<T>& >(holder);
+            return *any_ns::any_cast<T>(holder);
         }
 
         /** @brief Provided for testing only. */