Switch to generated interface factory methods

Automatically populate the association of interface with an
appropriate sdbusplus server side interface binding.

Change-Id: Ie46d91cf2e6726b033789be6228c10ca14a76220
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/generated.mako.cpp b/generated.mako.cpp
index a92daf1..44528cf 100644
--- a/generated.mako.cpp
+++ b/generated.mako.cpp
@@ -3,6 +3,9 @@
 // This file was auto generated.  Do not edit.
 
 #include "manager.hpp"
+% for i in interfaces:
+#include <${'/'.join(i.split('.') + ['server.hpp'])}>
+% endfor
 
 namespace phosphor
 {
@@ -11,6 +14,16 @@
 namespace manager
 {
 
+const Manager::Makers Manager::_makers{
+% for i in interfaces:
+    {
+        "${i}",
+        details::interface::holder::Holder<
+            sdbusplus::server::${'::'.join(i.split('.'))}>::make,
+    },
+% endfor
+};
+
 const Manager::Events Manager::_events{
 % for e in events:
     {
diff --git a/manager.cpp b/manager.cpp
index a846a0b..77d5990 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -101,18 +101,10 @@
 void Manager::notify(std::string path, Object object)
 {
     try {
-        using MakerType = HolderPtr(*)(
-                sdbusplus::bus::bus &, const char *);
-        using Makers = std::map<std::string, MakerType>;
-
         if(object.cbegin() == object.cend())
             throw std::runtime_error(
                     "No interfaces in " + path);
 
-        static const Makers makers{
-            // TODO - Add mappings here.
-        };
-
         path.insert(0, _root);
 
         auto obj = _refs.find(path);
@@ -126,9 +118,9 @@
         InterfaceComposite ref;
 
         for (auto &x: object) {
-            auto maker = makers.find(x.first.c_str());
+            auto maker = _makers.find(x.first.c_str());
 
-            if(maker == makers.end())
+            if(maker == _makers.end())
                 throw std::runtime_error(
                         "Unimplemented interface: " + x.first);
 
diff --git a/manager.hpp b/manager.hpp
index 5f78066..16a13e6 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -143,6 +143,9 @@
     using InterfaceComposite = std::map<std::string, HolderPtr>;
     using ObjectReferences = std::map<std::string, InterfaceComposite>;
     using Events = std::map<const char *, Event>;
+    using MakerType = HolderPtr(*)(
+            sdbusplus::bus::bus &, const char *);
+    using Makers = std::map<std::string, MakerType>;
 
     /** @brief Provided for testing only. */
     bool _shutdown;
@@ -167,6 +170,9 @@
 
     /** @brief A container of pimgen generated events and responses.  */
     static const Events _events;
+
+    /** @brief A container of pimgen generated factory methods.  */
+    static const Makers _makers;
 };
 
 } // namespace manager
diff --git a/test/test.cpp b/test/test.cpp
index 350684b..6b8e7e1 100644
--- a/test/test.cpp
+++ b/test/test.cpp
@@ -43,8 +43,8 @@
         using inner = std::map<std::string, var>;
         using outer = std::map<std::string, inner>;
 
-        inner i = {{"test.property", "a"}};
-        outer o = {{"test.iface", i}};
+        inner i = {{"ExampleProperty1", "test"}};
+        outer o = {{"xyz.openbmc_project.Example.Iface1", i}};
 
         m.append(o);
         auto reply = b.call(m);