Add support for callbacks

Callbacks are the response in the PDM 'trigger->response' model.
Add general support for implementing callbacks and implement
a log to systemd journal using that framework.

Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Change-Id: I8bead5368ee5472a02b47e8bba9e9df3a1f346bc
diff --git a/src/templates/generated.mako.hpp b/src/templates/generated.mako.hpp
index 0911e3a..61c2b6f 100644
--- a/src/templates/generated.mako.hpp
+++ b/src/templates/generated.mako.hpp
@@ -5,6 +5,7 @@
 #include <array>
 #include <string>
 #include "data_types.hpp"
+#include "journal.hpp"
 #include "propertywatchimpl.hpp"
 #include "sdbusplus.hpp"
 
@@ -107,15 +108,15 @@
                     {
                         PropertyIndex::key_type
                         {
-                            ConfigPaths::get()[${i[0]}],
-                            ConfigInterfaces::get()[${i[2]}],
-                            ConfigProperties::get()[${i[3]}]
+                            std::cref(ConfigPaths::get()[${i[0]}]),
+                            std::cref(ConfigInterfaces::get()[${i[2]}]),
+                            std::cref(ConfigProperties::get()[${i[3]}])
                         },
                         PropertyIndex::mapped_type
                         {
-                            ConfigMeta::get()[${i[1]}],
-                            ConfigMeta::get()[${i[4]}],
-                            ConfigPropertyStorage::get()[${i[5]}]
+                            std::cref(ConfigMeta::get()[${i[1]}]),
+                            std::cref(ConfigMeta::get()[${i[4]}]),
+                            std::ref(ConfigPropertyStorage::get()[${i[5]}])
                         },
                     },
     % endfor
@@ -127,6 +128,22 @@
     }
 };
 
+struct ConfigPropertyCallbacks
+{
+    using Callbacks = std::array<std::unique_ptr<Callback>, ${len(callbacks)}>;
+
+    static auto& get()
+    {
+        static const Callbacks propertyCallbacks =
+        {
+% for c in callbacks:
+            ${c.construct(loader, indent=indent +3)},
+% endfor
+        };
+        return propertyCallbacks;
+    }
+};
+
 struct ConfigPropertyWatches
 {
     using PropertyWatches = std::array<std::unique_ptr<Watch>, ${len(watches)}>;