You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2017/03/21 20:02:14 UTC

celix git commit: CELIX-386: Refactor registering callbacks for C++ dep man. callbacks are now always converted to std::function.

Repository: celix
Updated Branches:
  refs/heads/develop 4b760987a -> 544906ff6


CELIX-386: Refactor registering callbacks for C++ dep man. callbacks are now always converted to std::function.


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/544906ff
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/544906ff
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/544906ff

Branch: refs/heads/develop
Commit: 544906ff6f8e2a6d6fe8dc29fb615cfa54904e70
Parents: 4b76098
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Tue Mar 21 21:01:14 2017 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Tue Mar 21 21:01:14 2017 +0100

----------------------------------------------------------------------
 .../private/src/dm_component_impl.c             |   2 +-
 .../public/include/dm_component.h               |   4 +-
 .../public/include/dm_service_dependency.h      |   2 +-
 .../include/celix/dm/Component_Impl.h           |   4 +-
 .../include/celix/dm/ServiceDependency.h        |  67 ++++--
 .../include/celix/dm/ServiceDependency_Impl.h   | 229 +++++++++----------
 6 files changed, 165 insertions(+), 143 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager/private/src/dm_component_impl.c
----------------------------------------------------------------------
diff --git a/dependency_manager/private/src/dm_component_impl.c b/dependency_manager/private/src/dm_component_impl.c
index 27db3a5..13a2ee0 100644
--- a/dependency_manager/private/src/dm_component_impl.c
+++ b/dependency_manager/private/src/dm_component_impl.c
@@ -330,7 +330,7 @@ celix_status_t component_stopTask(dm_component_pt component, void *data __attrib
     return status;
 }
 
-celix_status_t setCLanguageProperty(dm_component_pt component, bool setCLangProp) {
+celix_status_t component_setCLanguageProperty(dm_component_pt component, bool setCLangProp) {
     component->setCLanguageProperty = setCLangProp;
     return CELIX_SUCCESS;
 }

http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager/public/include/dm_component.h
----------------------------------------------------------------------
diff --git a/dependency_manager/public/include/dm_component.h b/dependency_manager/public/include/dm_component.h
index f88171c..2cdad6d 100644
--- a/dependency_manager/public/include/dm_component.h
+++ b/dependency_manager/public/include/dm_component.h
@@ -68,9 +68,9 @@ void component_destroy(dm_component_pt component);
 
 /**
  * Specify if a default 'service.lang=C' should be added to the properties of interfaces if no 'service.lang' has been
- * provided. Default is true. Note that this should be set before using component_addInterface.
+ * provided. Default is false. Note that this should be set before using component_addInterface.
  */
-celix_status_t setCLanguageProperty(dm_component_pt component, bool setCLangProp);
+celix_status_t component_setCLanguageProperty(dm_component_pt component, bool setCLangProp);
 
 
 /**

http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager/public/include/dm_service_dependency.h
----------------------------------------------------------------------
diff --git a/dependency_manager/public/include/dm_service_dependency.h b/dependency_manager/public/include/dm_service_dependency.h
index ba63d0a..fb34230 100644
--- a/dependency_manager/public/include/dm_service_dependency.h
+++ b/dependency_manager/public/include/dm_service_dependency.h
@@ -74,7 +74,7 @@ celix_status_t serviceDependency_setRequired(dm_service_dependency_pt dependency
 
 /**
  * Specify if the servide dependency should add a C language filter for this dependency if no "service.lang" part if found the in the provided filter.
- * Default is true
+ * Default is false
  */
 celix_status_t serviceDependency_setAddCLanguageFilter(dm_service_dependency_pt dependency, bool addCLangFilter);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager_cxx/include/celix/dm/Component_Impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/Component_Impl.h b/dependency_manager_cxx/include/celix/dm/Component_Impl.h
index 86dbe33..81b3903 100644
--- a/dependency_manager_cxx/include/celix/dm/Component_Impl.h
+++ b/dependency_manager_cxx/include/celix/dm/Component_Impl.h
@@ -93,7 +93,7 @@ template<class T>
 template<class I>
 ServiceDependency<T,I>& Component<T>::createServiceDependency(const std::string name) {
 #ifdef __EXCEPTIONS
-    auto dep = std::shared_ptr<ServiceDependency<T,I>> {new ServiceDependency<T,I>()};
+    auto dep = std::shared_ptr<ServiceDependency<T,I>> {new ServiceDependency<T,I>(name)};
 #else
     static ServiceDependency<T,I> invalidDep{std::string{}, false};
     auto dep = std::shared_ptr<ServiceDependency<T,I>> {new(std::nothrow) ServiceDependency<T,I>(name)};
@@ -119,7 +119,7 @@ template<class T>
 template<typename I>
 CServiceDependency<T,I>& Component<T>::createCServiceDependency(const std::string name) {
 #ifdef __EXCEPTIONS
-    auto dep = std::shared_ptr<CServiceDependency<T,I>> {new CServiceDependency<T,I>()};
+    auto dep = std::shared_ptr<CServiceDependency<T,I>> {new CServiceDependency<T,I>(name)};
 #else
     static CServiceDependency<T,I> invalidDep{std::string{}, false};
     auto dep = std::shared_ptr<CServiceDependency<T,I>> {new(std::nothrow) CServiceDependency<T,I>(name)};

http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager_cxx/include/celix/dm/ServiceDependency.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/ServiceDependency.h b/dependency_manager_cxx/include/celix/dm/ServiceDependency.h
index c664fb2..55be966 100644
--- a/dependency_manager_cxx/include/celix/dm/ServiceDependency.h
+++ b/dependency_manager_cxx/include/celix/dm/ServiceDependency.h
@@ -29,6 +29,7 @@
 #include <tuple>
 #include <memory>
 #include <iostream>
+#include <functional>
 
 /**
  * TODO add a dependency for a whiteboard pattern or marker service. e.g. a service where the type is irrelevant.
@@ -88,18 +89,12 @@ namespace celix { namespace dm {
         std::string filter {};
         std::string versionRange {};
 
-        void (T::*setFp)(const I* service) {nullptr};
-        void (T::*setFpWithProperties)(const I* service, Properties&& properties) {nullptr};
-
-        void (T::*addFp)(const I* service) {nullptr};
-        void (T::*addFpWithProperties)(const I* service, Properties&& properties) {nullptr};
-
-        void (T::*removeFp)(const I* service) {nullptr};
-        void (T::*removeFpWithProperties)(const I* service, Properties&& properties) {nullptr};
+	std::function<void(const I* service, Properties&& properties)> setFp{nullptr};
+	std::function<void(const I* service, Properties&& properties)> addFp{nullptr};
+	std::function<void(const I* service, Properties&& properties)> removeFp{nullptr};
 
         void setupCallbacks();
-        int invokeCallback(void(T::*fp)(const I*), const void* service);
-        int invokeCallbackWithProperties(void(T::*fp)(const I*, Properties&&), service_reference_pt  ref, const void* service);
+        int invokeCallback(std::function<void(const I*, Properties&&)> fp, service_reference_pt  ref, const void* service);
 
         void setupService();
     public:
@@ -151,11 +146,18 @@ namespace celix { namespace dm {
         CServiceDependency<T,I>& setCallbacks(void (T::*set)(const I* service, Properties&& properties));
 
         /**
+         * Set the set callback for when the service dependency becomes available
+         *
+         * @return the C service dependency reference for chaining (fluent API)
+         */
+        CServiceDependency<T,I>& setCallbacks(std::function<void(const I* service, Properties&& properties)> set);
+
+        /**
          * Set the add and remove callback for when the services of service dependency are added or removed.
          *
          * @return the C service dependency reference for chaining (fluent API)
          */
-        CServiceDependency<T,I>& setCallbacks( void (T::*add)(const I* service),  void (T::*remove)(const I* service));
+        CServiceDependency<T,I>& setCallbacks(void (T::*add)(const I* service),  void (T::*remove)(const I* service));
 
         /**
          * Set the add and remove callback for when the services of service dependency are added or removed.
@@ -168,6 +170,16 @@ namespace celix { namespace dm {
         );
 
         /**
+         * Set the add and remove callback for when the services of service dependency are added or removed.
+         *
+         * @return the C service dependency reference for chaining (fluent API)
+         */
+        CServiceDependency<T,I>& setCallbacks(
+		std::function<void(const I* service, Properties&& properties)> add,
+		std::function<void(const I* service, Properties&& properties)> remove
+        );
+
+        /**
          * Specify if the service dependency should add a service.lang filter part if it is not already present
          * For C service dependencies 'service.lang=C' will be added.
          */
@@ -184,19 +196,13 @@ namespace celix { namespace dm {
         std::string versionRange {};
         std::string modifiedFilter {};
 
-        void (T::*setFp)(I* service) {nullptr};
-        void (T::*setFpWithProperties)(I* service, Properties&& properties) {nullptr};
-
-        void (T::*addFp)(I* service) {nullptr};
-        void (T::*addFpWithProperties)(I* service, Properties&& properties) {nullptr};
-
-        void (T::*removeFp)(I* service) {nullptr};
-        void (T::*removeFpWithProperties)(I* service, Properties&& properties) {nullptr};
+	std::function<void(I* service, Properties&& properties)> setFp{nullptr};
+	std::function<void(I* service, Properties&& properties)> addFp{nullptr};
+	std::function<void(I* service, Properties&& properties)> removeFp{nullptr};
 
         void setupService();
         void setupCallbacks();
-        int invokeCallback(void(T::*fp)(I*), const void* service);
-        int invokeCallbackWithProperties(void(T::*fp)(I*, Properties&&), service_reference_pt  ref, const void* service);
+        int invokeCallback(std::function<void(I*, Properties&&)> fp, service_reference_pt  ref, const void* service);
     public:
         ServiceDependency(const std::string name = std::string{}, bool valid = true);
         virtual ~ServiceDependency() = default;
@@ -237,11 +243,18 @@ namespace celix { namespace dm {
         ServiceDependency<T,I>& setCallbacks(void (T::*set)(I* service, Properties&& properties));
 
         /**
+         * Set the set callback for when the service dependency becomes available
+         *
+         * @return the C service dependency reference for chaining (fluent API)
+         */
+        ServiceDependency<T,I>& setCallbacks(std::function<void(I* service, Properties&& properties)> set);
+
+        /**
          * Set the add and remove callback for when the services of service dependency are added or removed.
          *
          * @return the C++ service dependency reference for chaining (fluent API)
          */
-        ServiceDependency<T,I>& setCallbacks( void (T::*add)(I* service),  void (T::*remove)(I* service));
+        ServiceDependency<T,I>& setCallbacks(void (T::*add)(I* service),  void (T::*remove)(I* service));
 
         /**
          * Set the add and remove callback for when the services of service dependency are added or removed.
@@ -254,6 +267,16 @@ namespace celix { namespace dm {
         );
 
         /**
+         * Set the add and remove callback for when the services of service dependency are added or removed.
+         *
+         * @return the C service dependency reference for chaining (fluent API)
+         */
+        ServiceDependency<T,I>& setCallbacks(
+		std::function<void(I* service, Properties&& properties)> add,
+		std::function<void(I* service, Properties&& properties)> remove
+        );
+
+        /**
          * Specify if the service dependency is required. Default is false
          *
          * @return the C service dependency reference for chaining (fluent API)

http://git-wip-us.apache.org/repos/asf/celix/blob/544906ff/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h b/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
index f22c0c5..731800d 100644
--- a/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
+++ b/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
@@ -55,9 +55,9 @@ void CServiceDependency<T,I>::setupService() {
 
 template<class T, typename I>
 CServiceDependency<T,I>& CServiceDependency<T,I>::setAddLanguageFilter(bool addLang) {
-    if (!this->valid) {
-        *this;
-    }
+//    if (!this->valid) {
+//        *this;
+//    }
     serviceDependency_setAddCLanguageFilter(this->cServiceDependency(), addLang);
     this->setupService();
     return *this;
@@ -84,14 +84,25 @@ CServiceDependency<T,I>& CServiceDependency<T,I>::setStrategy(DependencyUpdateSt
 //set callbacks
 template<class T, typename I>
 CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(void (T::*set)(const I* service)) {
-    this->setFp = set;
-    this->setupCallbacks();
+    this->setCallbacks([this, set](const I* service, Properties&& properties) {
+        T *cmp = this->componentInstance;
+        (cmp->*set)(service);
+    });
     return *this;
 }
 
 template<class T, typename I>
 CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(void (T::*set)(const I* service, Properties&& properties)) {
-    this->setFpWithProperties = set;
+    this->setCallbacks([this, set](const I* service, Properties&& properties) {
+        T *cmp = this->componentInstance;
+        (cmp->*set)(service, std::move(properties));
+    });
+    return *this;
+}
+
+template<class T, typename I>
+CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(std::function<void(const I* service, Properties&& properties)> set) {
+    this->setFp = set;
     this->setupCallbacks();
     return *this;
 }
@@ -101,9 +112,16 @@ template<class T, typename I>
 CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(
         void (T::*add)(const I* service),
         void (T::*remove)(const I* service)) {
-    this->addFp = add;
-    this->removeFp = remove;
-    this->setupCallbacks();
+    this->setCallbacks(
+		    [this, add](const I* service, Properties&& properties) {
+			    T *cmp = this->componentInstance;
+			    (cmp->*add)(service);
+		    },
+		    [this, remove](const I* service, Properties&& properties) {
+			    T *cmp = this->componentInstance;
+			    (cmp->*remove)(service);
+		    }
+    );
     return *this;
 }
 
@@ -112,8 +130,23 @@ CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(
         void (T::*add)(const I* service, Properties&& properties),
         void (T::*remove)(const I* service, Properties&& properties)
 ) {
-    this->addFpWithProperties = add;
-    this->removeFpWithProperties = remove;
+    this->setCallbacks(
+		    [this, add](const I* service, Properties&& properties) {
+			    T *cmp = this->componentInstance;
+			    (cmp->*add)(service, std::move(properties));
+		    },
+		    [this, remove](const I* service, Properties&& properties) {
+			    T *cmp = this->componentInstance;
+			    (cmp->*remove)(service, std::move(properties));
+		    }
+    );
+    return *this;
+}
+
+template<class T, typename I>
+CServiceDependency<T,I>& CServiceDependency<T,I>::setCallbacks(std::function<void(const I* service, Properties&& properties)> add, std::function<void(const I* service, Properties&& properties)> remove) {
+    this->addFp = add;;
+    this->removeFp = remove;
     this->setupCallbacks();
     return *this;
 }
@@ -125,71 +158,36 @@ void CServiceDependency<T,I>::setupCallbacks() {
         return;
     }
 
-    int(*cset)(void*,const void*) {nullptr};
-    int(*cadd)(void*, const void*) {nullptr};
-    int(*cremove)(void*, const void*) {nullptr};
-
+    int(*cset)(void*, service_reference_pt, const void*) {nullptr};
+    int(*cadd)(void*, service_reference_pt, const void*) {nullptr};
+    int(*crem)(void*, service_reference_pt, const void*) {nullptr};
 
     if (setFp != nullptr) {
-        cset = [](void* handle, const void* service) -> int {
+        cset = [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallback(dep->setFp, service);
+            return dep->invokeCallback(dep->setFp, ref, service);
         };
     }
     if (addFp != nullptr) {
-        cadd = [](void* handle, const void* service) -> int {
+        cadd = [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallback(dep->addFp, service);
+            return dep->invokeCallback(dep->addFp, ref, service);
         };
     }
     if (removeFp != nullptr) {
-        cremove = [](void* handle, const void* service) -> int {
+        crem= [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallback(dep->removeFp, service);
+            return dep->invokeCallback(dep->removeFp, ref, service);
         };
     }
-
-    int(*csetWithRef)(void*, service_reference_pt, const void*) {nullptr};
-    int(*caddWithRef)(void*, service_reference_pt, const void*) {nullptr};
-    int(*cremoveWithRef)(void*, service_reference_pt, const void*) {nullptr};
-
-    if (setFpWithProperties != nullptr) {
-        csetWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
-            auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->setFpWithProperties, ref, service);
-        };
-    }
-    if (addFpWithProperties != nullptr) {
-        caddWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
-            auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->addFpWithProperties, ref, service);
-        };
-    }
-    if (removeFpWithProperties != nullptr) {
-        cremoveWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
-            auto dep = (CServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->removeFpWithProperties, ref, service);
-        };
-    }
-
     serviceDependency_setCallbackHandle(this->cServiceDependency(), this);
-    serviceDependency_setCallbacks(this->cServiceDependency(), cset, cadd, nullptr, cremove, nullptr);
-    serviceDependency_setCallbacksWithServiceReference(this->cServiceDependency(), csetWithRef, caddWithRef, nullptr, cremoveWithRef, nullptr);
-};
-
-template<class T, typename I>
-int CServiceDependency<T,I>::invokeCallback(void(T::*fp)(const I*), const void* service) {
-    T *cmp = this->componentInstance;
-    const I* srv = (const I*) service;
-    (cmp->*fp)(srv);
-    return 0;
-};
+    serviceDependency_setCallbacksWithServiceReference(this->cServiceDependency(), cset, cadd, nullptr, crem, nullptr);
+}
 
 template<class T, typename I>
-int CServiceDependency<T,I>::invokeCallbackWithProperties(void(T::*fp)(const I*, Properties&&), service_reference_pt  ref, const void* service) {
+int CServiceDependency<T,I>::invokeCallback(std::function<void(const I*, Properties&&)> fp, service_reference_pt  ref, const void* service) {
     service_registration_pt reg {nullptr};
     properties_pt props {nullptr};
-    T *cmp = this->componentInstance;
     serviceReference_getServiceRegistration(ref, &reg);
     serviceRegistration_getProperties(reg, &props);
 
@@ -207,7 +205,7 @@ int CServiceDependency<T,I>::invokeCallbackWithProperties(void(T::*fp)(const I*,
 
     const I* srv = (const I*) service;
 
-    (cmp->*fp)(srv, static_cast<Properties&&>(properties)); //explicit move of lvalue properties.
+    fp(srv, std::move(properties));
     return 0;
 }
 
@@ -305,14 +303,25 @@ ServiceDependency<T,I>& ServiceDependency<T,I>::setAddLanguageFilter(bool addLan
 //set callbacks
 template<class T, class I>
 ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(void (T::*set)(I* service)) {
-    this->setFp = set;
-    this->setupCallbacks();
+    this->setCallbacks([this, set](I* srv, Properties&& props) {
+        T *cmp = this->componentInstance;
+        (cmp->*set)(srv);
+    });
     return *this;
 }
 
 template<class T, class I>
 ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(void (T::*set)(I* service, Properties&& properties)) {
-    this->setFpWithProperties = set;
+    this->setCallbacks([this, set](I* srv, Properties&& props) {
+        T *cmp = this->componentInstance;
+        (cmp->*set)(srv, std::move(props));
+    });
+    return *this;
+}
+
+template<class T, class I>
+ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(std::function<void(I* service, Properties&& properties)> set) {
+    this->setFp = set;
     this->setupCallbacks();
     return *this;
 }
@@ -322,9 +331,16 @@ template<class T, class I>
 ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(
         void (T::*add)(I* service),
         void (T::*remove)(I* service)) {
-    this->addFp = add;
-    this->removeFp = remove;
-    this->setupCallbacks();
+    this->setCallbacks(
+	    [this, add](I* srv, Properties&& props) {
+        	T *cmp = this->componentInstance;
+        	(cmp->*add)(srv);
+    	    },
+	    [this, remove](I* srv, Properties&& props) {
+        	T *cmp = this->componentInstance;
+        	(cmp->*remove)(srv);
+    	    }
+    );
     return *this;
 }
 
@@ -333,8 +349,25 @@ ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(
         void (T::*add)(I* service, Properties&& properties),
         void (T::*remove)(I* service, Properties&& properties)
         ) {
-    this->addFpWithProperties = add;
-    this->removeFpWithProperties = remove;
+    this->setCallbacks(
+	    [this, add](I* srv, Properties&& props) {
+        	T *cmp = this->componentInstance;
+        	(cmp->*add)(srv, std::move(props));
+    	    },
+	    [this, remove](I* srv, Properties&& props) {
+        	T *cmp = this->componentInstance;
+        	(cmp->*remove)(srv, std::move(props));
+    	    }
+    );
+    return *this;
+}
+
+template<class T, class I>
+ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks(
+		std::function<void(I* service, Properties&& properties)> add,
+		std::function<void(I* service, Properties&& properties)> remove) {
+    this->addFp = add;
+    this->removeFp = remove;
     this->setupCallbacks();
     return *this;
 }
@@ -352,18 +385,9 @@ ServiceDependency<T,I>& ServiceDependency<T,I>::setStrategy(DependencyUpdateStra
 };
 
 template<class T, class I>
-int ServiceDependency<T,I>::invokeCallback(void(T::*fp)(I*), const void* service) {
-    T *cmp = this->componentInstance;
-    I *svc = (I*)service;
-    (cmp->*fp)(svc);
-    return 0;
-};
-
-template<class T, class I>
-int ServiceDependency<T,I>::invokeCallbackWithProperties(void(T::*fp)(I*, Properties&&), service_reference_pt  ref, const void* service) {
+int ServiceDependency<T,I>::invokeCallback(std::function<void(I*, Properties&&)> fp, service_reference_pt  ref, const void* service) {
     service_registration_pt reg {nullptr};
     properties_pt props {nullptr};
-    T *cmp = this->componentInstance;
     I *svc = (I*)service;
     serviceReference_getServiceRegistration(ref, &reg);
     serviceRegistration_getProperties(reg, &props);
@@ -380,7 +404,7 @@ int ServiceDependency<T,I>::invokeCallbackWithProperties(void(T::*fp)(I*, Proper
         properties[key] = value;
     }
 
-    (cmp->*fp)(svc, static_cast<Properties&&>(properties)); //explicit move of lvalue properties.
+    fp(svc, std::move(properties)); //explicit move of lvalue properties.
     return 0;
 }
 
@@ -390,54 +414,29 @@ void ServiceDependency<T,I>::setupCallbacks() {
         return;
     }
 
-    int(*cset)(void*,const void*) {nullptr};
-    int(*cadd)(void*, const void*) {nullptr};
-    int(*cremove)(void*, const void*) {nullptr};
-
+    int(*cset)(void*, service_reference_pt, const void*) {nullptr};
+    int(*cadd)(void*, service_reference_pt, const void*) {nullptr};
+    int(*crem)(void*, service_reference_pt, const void*) {nullptr};
 
     if (setFp != nullptr) {
-        cset = [](void* handle, const void*service) -> int {
-            auto dep = (ServiceDependency<T, I> *) handle;
-            return dep->invokeCallback(dep->setFp, service);
-        };
-    }
-    if (addFp != nullptr) {
-        cadd = [](void* handle, const void*service) -> int {
-            auto dep = (ServiceDependency<T, I> *) handle;
-            return dep->invokeCallback(dep->addFp, service);
-        };
-    }
-    if (removeFp != nullptr) {
-        cremove = [](void* handle, const void*service) -> int {
-            auto dep = (ServiceDependency<T, I> *) handle;
-            return dep->invokeCallback(dep->removeFp, service);
-        };
-    }
-
-    int(*csetWithRef)(void*, service_reference_pt, const void*) {nullptr};
-    int(*caddWithRef)(void*, service_reference_pt, const void*) {nullptr};
-    int(*cremoveWithRef)(void*, service_reference_pt, const void*) {nullptr};
-
-    if (setFpWithProperties != nullptr) {
-        csetWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
+        cset = [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (ServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->setFpWithProperties, ref, service);
+            return dep->invokeCallback(dep->setFp, ref, service);
         };
     }
-    if (addFpWithProperties != nullptr) {
-        caddWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
+    if (addFp != nullptr) {
+        cadd = [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (ServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->addFpWithProperties, ref, service);
+            return dep->invokeCallback(dep->addFp, ref, service);
         };
     }
-    if (removeFpWithProperties != nullptr) {
-        cremoveWithRef = [](void* handle, service_reference_pt ref, const void* service) -> int {
+    if (removeFp != nullptr) {
+        crem = [](void* handle, service_reference_pt ref, const void* service) -> int {
             auto dep = (ServiceDependency<T,I>*) handle;
-            return dep->invokeCallbackWithProperties(dep->removeFpWithProperties, ref, service);
+            return dep->invokeCallback(dep->removeFp, ref, service);
         };
     }
 
     serviceDependency_setCallbackHandle(this->cServiceDependency(), this);
-    serviceDependency_setCallbacks(this->cServiceDependency(), cset, cadd, nullptr, cremove, nullptr);
-    serviceDependency_setCallbacksWithServiceReference(this->cServiceDependency(), csetWithRef, caddWithRef, nullptr, cremoveWithRef, nullptr);
+    serviceDependency_setCallbacksWithServiceReference(this->cServiceDependency(), cset, cadd, nullptr, crem, nullptr);
 };