Add new overload to register_property_r/rw

New overload doesn't take initial property values as parameter, instead
getter function result is used to set stored reference value. This
approach prevents situation when initial value can be different than
value returned by getter function which can cause signals to missbehave.

Tested:
- Changed examples register-property.cpp and get-all-properties.cpp to
  use new overload. Examples are working as before.

Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
Change-Id: Ib7d870dd9fa0c178e17d16c565e6f05339bf3e60
diff --git a/example/get-all-properties.cpp b/example/get-all-properties.cpp
index eaa2116..330e0c1 100644
--- a/example/get-all-properties.cpp
+++ b/example/get-all-properties.cpp
@@ -25,22 +25,20 @@
         demo_ =
             objServer_.add_unique_interface(demoObjectPath, demoInterfaceName);
 
-        demo_->register_property_r(propertyGrettingName, std::string(),
-                                   sdbusplus::vtable::property_::const_,
-                                   [this](const auto&) { return greetings_; });
+        demo_->register_property_r<std::string>(
+            propertyGrettingName, sdbusplus::vtable::property_::const_,
+            [this](const auto&) { return greetings_; });
 
-        demo_->register_property_rw(
-            propertyGoodbyesName, std::string(),
-            sdbusplus::vtable::property_::emits_change,
+        demo_->register_property_rw<std::string>(
+            propertyGoodbyesName, sdbusplus::vtable::property_::emits_change,
             [this](const auto& newPropertyValue, const auto&) {
                 goodbyes_ = newPropertyValue;
                 return 1;
             },
             [this](const auto&) { return goodbyes_; });
 
-        demo_->register_property_r(
-            propertyValueName, uint32_t{42},
-            sdbusplus::vtable::property_::const_,
+        demo_->register_property_r<uint32_t>(
+            propertyValueName, sdbusplus::vtable::property_::const_,
             [](const auto& value) -> uint32_t { return value; });
 
         demo_->initialize();
diff --git a/example/register-property.cpp b/example/register-property.cpp
index 6537aca..339c0ce 100644
--- a/example/register-property.cpp
+++ b/example/register-property.cpp
@@ -23,13 +23,12 @@
         demo_ = objServer_.add_unique_interface(
             demoObjectPath, demoInterfaceName,
             [this](sdbusplus::asio::dbus_interface& demo) {
-                demo.register_property_r(
-                    propertyGrettingName, std::string(),
-                    sdbusplus::vtable::property_::const_,
+                demo.register_property_r<std::string>(
+                    propertyGrettingName, sdbusplus::vtable::property_::const_,
                     [this](const auto&) { return greetings_; });
 
-                demo.register_property_rw(
-                    propertyGoodbyesName, std::string(),
+                demo.register_property_rw<std::string>(
+                    propertyGoodbyesName,
                     sdbusplus::vtable::property_::emits_change,
                     [this](const auto& newPropertyValue, const auto&) {
                         goodbyes_ = newPropertyValue;
diff --git a/include/sdbusplus/asio/object_server.hpp b/include/sdbusplus/asio/object_server.hpp
index 68e75f0..ac1c83a 100644
--- a/include/sdbusplus/asio/object_server.hpp
+++ b/include/sdbusplus/asio/object_server.hpp
@@ -293,8 +293,8 @@
     {}
     int call(message_t& m) override
     {
-        auto r = func_(*value_);
-        m.append(r);
+        *value_ = func_(*value_);
+        m.append(*value_);
         return 1;
     }
 
@@ -410,6 +410,15 @@
         return true;
     }
 
+    template <typename PropertyType, typename CallbackTypeGet>
+    bool register_property_r(const std::string& name,
+                             decltype(vtable_t::flags) flags,
+                             CallbackTypeGet&& getFunction)
+    {
+        return register_property_r(name, PropertyType{}, flags,
+                                   std::forward<CallbackTypeGet>(getFunction));
+    }
+
     template <typename PropertyType, typename CallbackTypeSet,
               typename CallbackTypeGet>
     bool register_property_rw(const std::string& name,
@@ -447,6 +456,18 @@
         return true;
     }
 
+    template <typename PropertyType, typename CallbackTypeSet,
+              typename CallbackTypeGet>
+    bool register_property_rw(const std::string& name,
+                              decltype(vtable_t::flags) flags,
+                              CallbackTypeSet&& setFunction,
+                              CallbackTypeGet&& getFunction)
+    {
+        return register_property_rw(name, PropertyType{}, flags,
+                                    std::forward<CallbackTypeSet>(setFunction),
+                                    std::forward<CallbackTypeGet>(getFunction));
+    }
+
     // default getter and setter
     template <typename PropertyType>
     bool register_property(