From 925a81284bb37bfdf345317bc63003f71c0fcc9e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Wed, 17 Dec 2014 13:26:16 +0100
Subject: [PATCH 1/2] sbus: use hard coded getters instead of generated

Properties are single value of a small number of predefined D-Bus
types. There is no need to generate them with codegen. Actually,
the source generator for property getters is already quite mess
with branching for array, strings and object paths. Adding any
more complex type in the future (such as dictionary) would require
even more branching or creating a separate path for it.

Hard coding the getters will simplify creating new ones for more
complex types. This patch also reduces lots of code duplication
and creates a simple function for GetAll.
---
 Makefile.am                                   |   2 +
 src/monitor/monitor_iface_generated.c         |  57 +-
 src/providers/data_provider_iface_generated.c |  57 +-
 src/responder/ifp/ifp_iface_generated.c       | 443 +--------------
 src/sbus/sbus_codegen                         | 133 +----
 src/sbus/sssd_dbus_invokers.c                 | 424 ++++++++++++++
 src/sbus/sssd_dbus_invokers.h                 | 120 ++++
 src/sbus/sssd_dbus_meta.h                     |  15 +-
 src/sbus/sssd_dbus_properties.c               |  51 +-
 src/tests/sbus_codegen_tests_generated.c      | 789 +-------------------------
 10 files changed, 654 insertions(+), 1437 deletions(-)
 create mode 100644 src/sbus/sssd_dbus_invokers.c
 create mode 100644 src/sbus/sssd_dbus_invokers.h

diff --git a/Makefile.am b/Makefile.am
index d5ce6109f06608eac0b632c92683890e3e3877d5..cd8ab4d733fd122d382a04c08df574157350e4fc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -521,6 +521,7 @@ dist_noinst_HEADERS = \
     src/sbus/sssd_dbus.h \
     src/sbus/sssd_dbus_meta.h \
     src/sbus/sssd_dbus_private.h \
+    src/sbus/sssd_dbus_invokers.h \
     src/db/sysdb.h \
     src/db/sysdb_sudo.h \
     src/db/sysdb_autofs.h \
@@ -709,6 +710,7 @@ libsss_util_la_SOURCES = \
     src/sbus/sssd_dbus_meta.c \
     src/sbus/sssd_dbus_interface.c \
     src/sbus/sssd_dbus_introspect.c \
+    src/sbus/sssd_dbus_invokers.c \
     src/sbus/sssd_dbus_properties.c \
     src/sbus/sssd_dbus_request.c \
     src/sbus/sssd_dbus_server.c \
diff --git a/src/monitor/monitor_iface_generated.c b/src/monitor/monitor_iface_generated.c
index 0eee10caefdf137e442e7c658436813d01025035..171cef7e65a0241d8a8b60e5476a8691c8ed3fb3 100644
--- a/src/monitor/monitor_iface_generated.c
+++ b/src/monitor/monitor_iface_generated.c
@@ -3,6 +3,7 @@
 #include "util/util.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
 #include "monitor_iface_generated.h"
 
 /* methods for org.freedesktop.sssd.monitor */
@@ -24,39 +25,13 @@ const struct sbus_method_meta mon_srv_iface__methods[] = {
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.monitor' interface */
-static int invoke_mon_srv_iface_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.monitor */
 const struct sbus_interface_meta mon_srv_iface_meta = {
     "org.freedesktop.sssd.monitor", /* name */
     mon_srv_iface__methods,
     NULL, /* no signals */
     NULL, /* no properties */
-    invoke_mon_srv_iface_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* methods for org.freedesktop.sssd.service */
@@ -127,37 +102,11 @@ const struct sbus_method_meta mon_cli_iface__methods[] = {
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.service' interface */
-static int invoke_mon_cli_iface_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.service */
 const struct sbus_interface_meta mon_cli_iface_meta = {
     "org.freedesktop.sssd.service", /* name */
     mon_cli_iface__methods,
     NULL, /* no signals */
     NULL, /* no properties */
-    invoke_mon_cli_iface_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
diff --git a/src/providers/data_provider_iface_generated.c b/src/providers/data_provider_iface_generated.c
index 58813762570c12b17c26f8116ced347de540b263..bdd6a4d76d18bbb44530d816fce14009736b6f6d 100644
--- a/src/providers/data_provider_iface_generated.c
+++ b/src/providers/data_provider_iface_generated.c
@@ -3,6 +3,7 @@
 #include "util/util.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
 #include "data_provider_iface_generated.h"
 
 /* methods for org.freedesktop.sssd.dataprovider */
@@ -59,39 +60,13 @@ const struct sbus_method_meta data_provider_iface__methods[] = {
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.dataprovider' interface */
-static int invoke_data_provider_iface_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.dataprovider */
 const struct sbus_interface_meta data_provider_iface_meta = {
     "org.freedesktop.sssd.dataprovider", /* name */
     data_provider_iface__methods,
     NULL, /* no signals */
     NULL, /* no properties */
-    invoke_data_provider_iface_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* methods for org.freedesktop.sssd.dataprovider_rev */
@@ -113,37 +88,11 @@ const struct sbus_method_meta data_provider_rev_iface__methods[] = {
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.dataprovider_rev' interface */
-static int invoke_data_provider_rev_iface_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.dataprovider_rev */
 const struct sbus_interface_meta data_provider_rev_iface_meta = {
     "org.freedesktop.sssd.dataprovider_rev", /* name */
     data_provider_rev_iface__methods,
     NULL, /* no signals */
     NULL, /* no properties */
-    invoke_data_provider_rev_iface_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
diff --git a/src/responder/ifp/ifp_iface_generated.c b/src/responder/ifp/ifp_iface_generated.c
index 62a21e911030c0c5fd1a700804cd01ebba186141..b7fcc3dba1cea70704f87a17853ff208e46e11a9 100644
--- a/src/responder/ifp/ifp_iface_generated.c
+++ b/src/responder/ifp/ifp_iface_generated.c
@@ -3,6 +3,7 @@
 #include "util/util.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
 #include "ifp_iface_generated.h"
 
 /* invokes a handler with a 's' DBus signature */
@@ -10,11 +11,6 @@ static int invoke_s_method(struct sbus_request *dbus_req, void *function_ptr);
 
 /* invokes a handler with a 'u' DBus signature */
 static int invoke_u_method(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_s(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_u(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_b(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_as(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_o(struct sbus_request *dbus_req, void *function_ptr);
 
 /* arguments for org.freedesktop.sssd.infopipe.ListComponents */
 const struct sbus_arg_meta infopipe_iface_ListComponents__out[] = {
@@ -252,39 +248,13 @@ const struct sbus_method_meta infopipe_iface__methods[] = {
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.infopipe' interface */
-static int invoke_infopipe_iface_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.infopipe */
 const struct sbus_interface_meta infopipe_iface_meta = {
     "org.freedesktop.sssd.infopipe", /* name */
     infopipe_iface__methods,
     NULL, /* no signals */
     NULL, /* no properties */
-    invoke_infopipe_iface_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 int infopipe_component_Enable_finish(struct sbus_request *req)
@@ -363,7 +333,7 @@ const struct sbus_property_meta infopipe_component__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_component, infopipe_component_get_name),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -372,7 +342,7 @@ const struct sbus_property_meta infopipe_component__properties[] = {
         "u", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_component, infopipe_component_get_debug_level),
-        invoke_get_u,
+        sbus_invoke_get_u,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -381,7 +351,7 @@ const struct sbus_property_meta infopipe_component__properties[] = {
         "b", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_component, infopipe_component_get_enabled),
-        invoke_get_b,
+        sbus_invoke_get_b,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -390,7 +360,7 @@ const struct sbus_property_meta infopipe_component__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_component, infopipe_component_get_type),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -399,117 +369,20 @@ const struct sbus_property_meta infopipe_component__properties[] = {
         "as", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_component, infopipe_component_get_providers),
-        invoke_get_as,
+        sbus_invoke_get_as,
         0, /* not writable */
         NULL, /* no invoker */
     },
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.infopipe.Components' interface */
-static int invoke_infopipe_component_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-    int ret;
-    struct sbus_interface *intf = dbus_req->intf;
-    const struct sbus_property_meta *property;
-    const char * s_prop_val;
-    const char * s_out_val;
-    void (*s_handler)(struct sbus_request *, void *data, const char * *);
-    bool b_prop_val;
-    dbus_bool_t b_out_val;
-    void (*b_handler)(struct sbus_request *, void *data, bool *);
-    uint32_t u_prop_val;
-    uint32_t u_out_val;
-    void (*u_handler)(struct sbus_request *, void *data, uint32_t *);
-    const char * *as_prop_val;
-    int as_prop_len;
-    const char * *as_out_val;
-    void (*as_handler)(struct sbus_request *, void *data, const char * * *, int *);
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    property = sbus_meta_find_property(intf->vtable->meta, "name");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "name", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "debug_level");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        u_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (u_handler) {
-            (u_handler)(dbus_req, dbus_req->intf->instance_data, &u_prop_val);
-            u_out_val = u_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "debug_level", DBUS_TYPE_UINT32, &u_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "enabled");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        b_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (b_handler) {
-            (b_handler)(dbus_req, dbus_req->intf->instance_data, &b_prop_val);
-            b_out_val = b_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "enabled", DBUS_TYPE_BOOLEAN, &b_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "type");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "type", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "providers");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        as_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (as_handler) {
-            (as_handler)(dbus_req, dbus_req->intf->instance_data, &as_prop_val, &as_prop_len);
-            as_out_val = as_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "providers", DBUS_TYPE_STRING, (uint8_t*)as_out_val, as_prop_len, sizeof(const char *));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.infopipe.Components */
 const struct sbus_interface_meta infopipe_component_meta = {
     "org.freedesktop.sssd.infopipe.Components", /* name */
     infopipe_component__methods,
     NULL, /* no signals */
     infopipe_component__properties,
-    invoke_infopipe_component_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* property info for org.freedesktop.sssd.infopipe.Domains */
@@ -519,7 +392,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_name),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -528,7 +401,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_provider),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -537,7 +410,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "as", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_primary_servers),
-        invoke_get_as,
+        sbus_invoke_get_as,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -546,7 +419,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "as", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_backup_servers),
-        invoke_get_as,
+        sbus_invoke_get_as,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -555,7 +428,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "u", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_min_id),
-        invoke_get_u,
+        sbus_invoke_get_u,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -564,7 +437,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "u", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_max_id),
-        invoke_get_u,
+        sbus_invoke_get_u,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -573,7 +446,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_realm),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -582,7 +455,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_forest),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -591,7 +464,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_login_format),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -600,7 +473,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_fully_qualified_name_format),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -609,7 +482,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "b", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_enumerable),
-        invoke_get_b,
+        sbus_invoke_get_b,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -618,7 +491,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "b", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_use_fully_qualified_names),
-        invoke_get_b,
+        sbus_invoke_get_b,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -627,7 +500,7 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "b", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_subdomain),
-        invoke_get_b,
+        sbus_invoke_get_b,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -636,219 +509,20 @@ const struct sbus_property_meta infopipe_domain__properties[] = {
         "o", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct infopipe_domain, infopipe_domain_get_parent_domain),
-        invoke_get_o,
+        sbus_invoke_get_o,
         0, /* not writable */
         NULL, /* no invoker */
     },
     { NULL, }
 };
 
-/* invokes GetAll for the 'org.freedesktop.sssd.infopipe.Domains' interface */
-static int invoke_infopipe_domain_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-    int ret;
-    struct sbus_interface *intf = dbus_req->intf;
-    const struct sbus_property_meta *property;
-    const char * s_prop_val;
-    const char * s_out_val;
-    void (*s_handler)(struct sbus_request *, void *data, const char * *);
-    bool b_prop_val;
-    dbus_bool_t b_out_val;
-    void (*b_handler)(struct sbus_request *, void *data, bool *);
-    uint32_t u_prop_val;
-    uint32_t u_out_val;
-    void (*u_handler)(struct sbus_request *, void *data, uint32_t *);
-    const char * *as_prop_val;
-    int as_prop_len;
-    const char * *as_out_val;
-    void (*as_handler)(struct sbus_request *, void *data, const char * * *, int *);
-    const char * o_prop_val;
-    const char * o_out_val;
-    void (*o_handler)(struct sbus_request *, void *data, const char * *);
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    property = sbus_meta_find_property(intf->vtable->meta, "name");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "name", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "provider");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "provider", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "primary_servers");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        as_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (as_handler) {
-            (as_handler)(dbus_req, dbus_req->intf->instance_data, &as_prop_val, &as_prop_len);
-            as_out_val = as_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "primary_servers", DBUS_TYPE_STRING, (uint8_t*)as_out_val, as_prop_len, sizeof(const char *));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "backup_servers");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        as_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (as_handler) {
-            (as_handler)(dbus_req, dbus_req->intf->instance_data, &as_prop_val, &as_prop_len);
-            as_out_val = as_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "backup_servers", DBUS_TYPE_STRING, (uint8_t*)as_out_val, as_prop_len, sizeof(const char *));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "min_id");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        u_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (u_handler) {
-            (u_handler)(dbus_req, dbus_req->intf->instance_data, &u_prop_val);
-            u_out_val = u_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "min_id", DBUS_TYPE_UINT32, &u_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "max_id");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        u_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (u_handler) {
-            (u_handler)(dbus_req, dbus_req->intf->instance_data, &u_prop_val);
-            u_out_val = u_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "max_id", DBUS_TYPE_UINT32, &u_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "realm");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "realm", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "forest");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "forest", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "login_format");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "login_format", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "fully_qualified_name_format");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "fully_qualified_name_format", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "enumerable");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        b_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (b_handler) {
-            (b_handler)(dbus_req, dbus_req->intf->instance_data, &b_prop_val);
-            b_out_val = b_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "enumerable", DBUS_TYPE_BOOLEAN, &b_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "use_fully_qualified_names");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        b_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (b_handler) {
-            (b_handler)(dbus_req, dbus_req->intf->instance_data, &b_prop_val);
-            b_out_val = b_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "use_fully_qualified_names", DBUS_TYPE_BOOLEAN, &b_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "subdomain");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        b_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (b_handler) {
-            (b_handler)(dbus_req, dbus_req->intf->instance_data, &b_prop_val);
-            b_out_val = b_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "subdomain", DBUS_TYPE_BOOLEAN, &b_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "parent_domain");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        o_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (o_handler) {
-            (o_handler)(dbus_req, dbus_req->intf->instance_data, &o_prop_val);
-            o_out_val = o_prop_val == NULL ? "/" : o_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "parent_domain", DBUS_TYPE_OBJECT_PATH, &o_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for org.freedesktop.sssd.infopipe.Domains */
 const struct sbus_interface_meta infopipe_domain_meta = {
     "org.freedesktop.sssd.infopipe.Domains", /* name */
     NULL, /* no methods */
     NULL, /* no signals */
     infopipe_domain__properties,
-    invoke_infopipe_domain_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* invokes a handler with a 's' DBus signature */
@@ -882,74 +556,3 @@ static int invoke_u_method(struct sbus_request *dbus_req, void *function_ptr)
     return (handler)(dbus_req, dbus_req->intf->instance_data,
                      arg_0);
 }
-
-/* invokes a getter with a 'const char *' DBus type */
-static int invoke_get_s(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * prop_val;
-    const char * out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val == NULL ? "" : prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_STRING, &out_val);
-}
-
-/* invokes a getter with a 'dbus_bool_t' DBus type */
-static int invoke_get_b(struct sbus_request *dbus_req, void *function_ptr)
-{
-    bool prop_val;
-    dbus_bool_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, bool *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_BOOLEAN, &out_val);
-}
-
-/* invokes a getter with a 'uint32_t' DBus type */
-static int invoke_get_u(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint32_t prop_val;
-    uint32_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint32_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_UINT32, &out_val);
-}
-
-/* invokes a getter with an array of 'const char *' DBus type */
-static int invoke_get_as(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * *prop_val;
-    int prop_len;
-    const char * *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_STRING, (uint8_t*)out_val, prop_len, sizeof(const char *));
-}
-
-/* invokes a getter with a 'const char *' DBus type */
-static int invoke_get_o(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * prop_val;
-    const char * out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val == NULL ? "/" : prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_OBJECT_PATH, &out_val);
-}
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen
index b4e63f33e6e5ef9fb56646142a29c97d35ca3ebf..fff5de75d167031f45ee87264770d9f04b4bf89f 100755
--- a/src/sbus/sbus_codegen
+++ b/src/sbus/sbus_codegen
@@ -190,7 +190,7 @@ class Property(Typed):
     def getter_name(self):
         return "%s_get_%s" % (self.iface.c_name(), self.c_name())
     def getter_invoker_name(self):
-        return "invoke_get_%s" % self.type
+        return "sbus_invoke_get_%s" % self.type
     def getter_signature(self, name):
         sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type)
         if self.is_array:
@@ -306,108 +306,6 @@ def source_prop_handler(prop, type_prefix=False):
     out("    %s", prop.getter_signature("%shandler" % prefix), new_line=False)
     out(";")
 
-def source_getter_invoker(prop):
-    out("")
-    if prop.is_array:
-        out("/* invokes a getter with an array of '%s' DBus type */", prop.dbus_type)
-    else:
-        out("/* invokes a getter with a '%s' DBus type */", prop.dbus_type)
-    out("static int %s(struct sbus_request *dbus_req, void *function_ptr)",
-        prop.getter_invoker_name())
-    out("{")
-
-    source_prop_types(prop)
-
-    out("")
-    out("    %s", prop.getter_signature("handler"), new_line=False)
-    out(" = function_ptr;")
-    out("")
-
-    out("    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val", new_line=False)
-    if prop.is_array:
-        out(", &prop_len", new_line=False)
-    out(");")
-
-    out("")
-    if prop.type == "s":
-        out("    out_val = prop_val == NULL ? \"\" : prop_val;")
-    elif prop.type == "o":
-        out("    out_val = prop_val == NULL ? \"/\" : prop_val;")
-    else:
-        out("    out_val = prop_val;")
-    if prop.is_array:
-        out("    return sbus_request_return_array_as_variant(dbus_req, %s, (uint8_t*)out_val, prop_len, sizeof(%s));", prop.dbus_constant, prop.sssd_type)
-    else:
-        out("    return sbus_request_return_as_variant(dbus_req, %s, &out_val);", prop.dbus_constant)
-    out("}")
-
-def source_getall_invoker(iface, prop_invokers):
-    out("")
-    out("/* invokes GetAll for the '%s' interface */", iface.name)
-    out("static int invoke_%s_get_all(struct sbus_request *dbus_req, void *function_ptr)",
-        iface.c_name())
-    out("{")
-    out("    DBusMessage *reply;")
-    out("    dbus_bool_t dbret;")
-    out("    DBusMessageIter iter;")
-    out("    DBusMessageIter iter_dict;")
-    if iface.properties:
-        out("    int ret;")
-        out("    struct sbus_interface *intf = dbus_req->intf;")
-        out("    const struct sbus_property_meta *property;")
-
-    iface_types = [ p.type for p in iface.properties ]
-    for prop in [ p for p in prop_invokers.values() if p.type in iface_types ]:
-        source_prop_types(prop, type_prefix=True)
-        source_prop_handler(prop, type_prefix=True)
-    out("")
-
-    out("    reply = dbus_message_new_method_return(dbus_req->message);")
-    out("    if (!reply) return ENOMEM;")
-    out("    dbus_message_iter_init_append(reply, &iter);")
-    out("    dbret = dbus_message_iter_open_container(")
-    out("                                     &iter, DBUS_TYPE_ARRAY,")
-    out("                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING")
-    out("                                     DBUS_TYPE_STRING_AS_STRING")
-    out("                                     DBUS_TYPE_VARIANT_AS_STRING")
-    out("                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,")
-    out("                                     &iter_dict);")
-    out("    if (!dbret) return ENOMEM;")
-    out("")
-
-    for prop in iface.properties:
-        out("    property = sbus_meta_find_property(intf->vtable->meta, \"%s\");", prop.c_name())
-        out("    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {")
-        out("        %s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);", prop.type)
-        out("        if (%s_handler) {", prop.type)
-        out("            (%s_handler)(dbus_req, dbus_req->intf->instance_data, &%s_prop_val", prop.type, prop.type, new_line=False)
-        if prop.is_array:
-            out(", &%s_prop_len", prop.type, new_line=False)
-        out(");")
-        if prop.type == "s":
-            out("            %s_out_val = %s_prop_val == NULL ? \"\" : %s_prop_val;",
-                prop.type, prop.type, prop.type)
-        elif prop.type == "o":
-            out("            %s_out_val = %s_prop_val == NULL ? \"/\" : %s_prop_val;",
-                prop.type, prop.type, prop.type)
-        else:
-            out("            %s_out_val = %s_prop_val;", prop.type, prop.type)
-        if prop.is_array:
-            out("            ret = sbus_add_array_as_variant_to_dict(&iter_dict, \"%s\", %s, (uint8_t*)%s_out_val, %s_prop_len, sizeof(%s));", prop.c_name(), prop.dbus_constant, prop.type, prop.type, prop.sssd_type)
-        else:
-            out("            ret = sbus_add_variant_to_dict(&iter_dict, \"%s\", %s, &%s_out_val);", prop.c_name(), prop.dbus_constant, prop.type)
-        out("            if (ret != EOK) return ret;")
-        out("        }")
-        out("    }")
-        out("")
-
-    out("    dbret = dbus_message_iter_close_container(&iter, &iter_dict);")
-    out("    if (!dbret) return ENOMEM;")
-    out("")
-
-    out("    return sbus_request_finish(dbus_req, reply);")
-    out("}")
-
 def forward_method_invokers(ifaces):
     invokers = { }
     for iface in ifaces:
@@ -425,27 +323,6 @@ def source_method_invokers(invokers):
     for (signature, meth) in invokers.items():
         source_method_invoker(signature, meth.in_args)
 
-def forward_prop_invoker(prop):
-    out("static int %s(struct sbus_request *dbus_req, void *function_ptr);",
-        prop.getter_invoker_name())
-
-def forward_prop_invokers(ifaces):
-    invokers = { }
-    for iface in ifaces:
-        for prop in iface.properties:
-            if not prop.is_basic:
-                continue
-            if prop.type in invokers:
-                continue
-            forward_prop_invoker(prop)
-            invokers[prop.type] = prop
-    return invokers
-
-def source_prop_invokers(invokers):
-    for (type, prop) in invokers.items():
-        if prop.readable:
-            source_getter_invoker(prop)
-
 def source_finisher(meth):
     out("")
     out("int %s_finish(struct sbus_request *req%s)",
@@ -590,7 +467,7 @@ def source_interface(iface):
         out("    %s__properties,", iface.c_name())
     else:
         out("    NULL, /* no properties */")
-    out("    invoke_%s_get_all, /* GetAll invoker */", iface.c_name())
+    out("    sbus_invoke_get_all, /* GetAll invoker */")
     out("};")
 
 def generate_source(ifaces, filename, include_header=None):
@@ -602,11 +479,11 @@ def generate_source(ifaces, filename, include_header=None):
     out("#include \"util/util.h\"")
     out("#include \"sbus/sssd_dbus.h\"")
     out("#include \"sbus/sssd_dbus_meta.h\"")
+    out("#include \"sbus/sssd_dbus_invokers.h\"")
     if include_header:
         out("#include \"%s\"", os.path.basename(include_header))
 
     meth_invokers = forward_method_invokers(ifaces)
-    prop_invokers = forward_prop_invokers(ifaces)
 
     for iface in ifaces:
 
@@ -622,14 +499,10 @@ def generate_source(ifaces, filename, include_header=None):
         if iface.properties:
             source_properties(iface, iface.properties)
 
-        # always generate getall, for interfaces without properties
-        # let's return an empty array
-        source_getall_invoker(iface, prop_invokers)
         # The sbus_interface structure
         source_interface(iface)
 
     source_method_invokers(meth_invokers)
-    source_prop_invokers(prop_invokers)
 
 def header_finisher(iface, meth):
     if meth.use_raw_handler():
diff --git a/src/sbus/sssd_dbus_invokers.c b/src/sbus/sssd_dbus_invokers.c
new file mode 100644
index 0000000000000000000000000000000000000000..e37a2b76aca53b051834a1e37d4cbf5683f00d7a
--- /dev/null
+++ b/src/sbus/sssd_dbus_invokers.c
@@ -0,0 +1,424 @@
+/*
+    Authors:
+        Pavel Březina <pbrezina@redhat.com>
+
+    Copyright (C) 2014 Red Hat
+
+    SBUS: Interface introspection
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#include <dbus/dbus.h>
+#include <errno.h>
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_invokers.h"
+
+#define INVOKE_STRING(sbus_req, iter, fn, prop_type, default_val) do {       \
+    void (*handler_fn)(struct sbus_request *, void *, const char **);        \
+    const char *prop_val;                                                    \
+    const char *dbus_val;                                                    \
+    dbus_bool_t dbret;                                                       \
+                                                                             \
+    handler_fn = fn;                                                         \
+    handler_fn(sbus_req, sbus_req->intf->instance_data, &prop_val);          \
+                                                                             \
+    dbus_val = prop_val == NULL ? default_val : prop_val;                    \
+    dbret = dbus_message_iter_append_basic(iter, prop_type, &dbus_val);      \
+    return dbret ? EOK : EIO;                                                \
+} while (0)
+
+#define INVOKE_BASIC(sbus_req, iter, fn, prop_type, c_type, dbus_type) do {  \
+    void (*handler_fn)(struct sbus_request *, void *, c_type *);             \
+    c_type prop_val;                                                         \
+    dbus_type dbus_val;                                                      \
+    dbus_bool_t dbret;                                                       \
+                                                                             \
+    handler_fn = fn;                                                         \
+    handler_fn(sbus_req, sbus_req->intf->instance_data, &prop_val);          \
+                                                                             \
+    dbus_val = prop_val;                                                     \
+    dbret = dbus_message_iter_append_basic(iter, prop_type, &dbus_val);      \
+    return dbret ? EOK : EIO;                                                \
+} while (0)
+
+#define INVOKE_ARRAY(sbus_req, iter, fn, prop_type, c_type, dbus_type) do {  \
+    void (*handler_fn)(struct sbus_request *, void *, c_type *, int *);      \
+    DBusMessageIter array;                                                   \
+    const char array_type[2] = {prop_type, '\0'};                            \
+    c_type prop_val;                                                         \
+    dbus_type dbus_val;                                                      \
+    dbus_bool_t dbret;                                                       \
+    int prop_len;                                                            \
+    int i;                                                                   \
+                                                                             \
+    handler_fn = fn;                                                         \
+    handler_fn(sbus_req, sbus_req->intf->instance_data,                      \
+               &prop_val, &prop_len);                                        \
+                                                                             \
+    dbus_val = prop_val;                                                     \
+    dbret = dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,          \
+                                             array_type, &array);            \
+    if (!dbret) {                                                            \
+        return EIO;                                                          \
+    }                                                                        \
+                                                                             \
+    for (i = 0; i < prop_len; i++) {                                         \
+        dbret = dbus_message_iter_append_basic(&array, prop_type,            \
+                                               &dbus_val[i]);                \
+        if (!dbret) {                                                        \
+            return EIO;                                                      \
+        }                                                                    \
+    }                                                                        \
+                                                                             \
+    dbret = dbus_message_iter_close_container(iter, &array);                 \
+    if (!dbret) {                                                            \
+        return EIO;                                                          \
+    }                                                                        \
+                                                                             \
+    return dbret ? EOK : EIO;                                                \
+} while (0)
+
+int sbus_invoke_get_y(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_BYTE,
+                 uint8_t, uint8_t);
+}
+
+int sbus_invoke_get_b(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_BOOLEAN,
+                 bool, dbus_bool_t);
+}
+
+int sbus_invoke_get_n(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_INT16,
+                 int16_t, int16_t);
+}
+
+int sbus_invoke_get_q(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_UINT16,
+                 uint16_t, uint16_t);
+}
+
+int sbus_invoke_get_i(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_INT32,
+                 int32_t, int32_t);
+}
+
+int sbus_invoke_get_u(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_UINT32,
+                 uint32_t, uint32_t);
+}
+
+int sbus_invoke_get_x(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_INT64,
+                 int64_t, int64_t);
+}
+
+int sbus_invoke_get_t(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_UINT64,
+                 uint64_t, uint64_t);
+}
+
+int sbus_invoke_get_d(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_BASIC(sbus_req, iter, function_ptr, DBUS_TYPE_DOUBLE,
+                 double, double);
+}
+
+int sbus_invoke_get_s(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_STRING(sbus_req, iter, function_ptr, DBUS_TYPE_STRING, "");
+}
+
+int sbus_invoke_get_o(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr)
+{
+    INVOKE_STRING(sbus_req, iter, function_ptr, DBUS_TYPE_OBJECT_PATH, "/");
+}
+
+int sbus_invoke_get_ay(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_BYTE,
+                 uint8_t *, uint8_t *);
+}
+
+int sbus_invoke_get_an(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_INT16,
+                 int16_t *, int16_t *);
+}
+
+int sbus_invoke_get_aq(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_UINT16,
+                 uint16_t *, uint16_t *);
+}
+
+int sbus_invoke_get_ai(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_INT32,
+                 int32_t *, int32_t *);
+}
+
+int sbus_invoke_get_au(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_UINT32,
+                 uint32_t *, uint32_t *);
+}
+
+int sbus_invoke_get_ax(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_INT64,
+                 int64_t *, int64_t *);
+}
+
+int sbus_invoke_get_at(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_UINT64,
+                 uint64_t *, uint64_t *);
+}
+
+int sbus_invoke_get_ad(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_DOUBLE,
+                 double *, double *);
+}
+
+int sbus_invoke_get_as(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_STRING,
+                 const char **, const char **);
+}
+
+int sbus_invoke_get_ao(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr)
+{
+    INVOKE_ARRAY(sbus_req, iter, function_ptr, DBUS_TYPE_OBJECT_PATH,
+                 const char **, const char **);
+}
+
+void sbus_invoke_get(struct sbus_request *sbus_req,
+                     const char *type,
+                     sbus_get_invoker_fn invoker_fn,
+                     sbus_msg_handler_fn handler_fn)
+{
+    DBusMessage *reply = NULL;
+    DBusMessageIter iter;
+    DBusMessageIter variant;
+    dbus_bool_t dbret;
+    errno_t ret;
+
+    reply = dbus_message_new_method_return(sbus_req->message);
+    if (reply == NULL) {
+        ret = ENOMEM;
+        goto fail;
+    }
+
+    dbus_message_iter_init_append(reply, &iter);
+
+    dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+                                             type, &variant);
+    if (!dbret) {
+        ret = ENOMEM;
+        goto fail;
+    }
+
+    ret = invoker_fn(&variant, sbus_req, handler_fn);
+    if (ret != EOK) {
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              "Invoker error [%d]: %s\n", ret, sss_strerror(ret));
+        goto fail;
+    }
+
+    dbret = dbus_message_iter_close_container(&iter, &variant);
+    if (!dbret) {
+        ret = EIO;
+        goto fail;
+    }
+
+    sbus_request_finish(sbus_req, reply);
+    return;
+
+fail:
+    DEBUG(SSSDBG_CRIT_FAILURE,
+          "Unable to reply [%d]: %s\n", ret, sss_strerror(ret));
+
+    if (reply != NULL) {
+        dbus_message_unref(reply);
+    }
+    sbus_request_finish(sbus_req, NULL);
+
+    return;
+}
+
+void sbus_invoke_get_all(struct sbus_request *sbus_req)
+{
+    const struct sbus_property_meta *props;
+    sbus_msg_handler_fn *handler_fn;
+    DBusMessage *reply = NULL;
+    DBusMessageIter iter;
+    DBusMessageIter array;
+    DBusMessageIter dict;
+    DBusMessageIter variant;
+    dbus_bool_t dbret;
+    errno_t ret;
+    int i;
+
+    reply = dbus_message_new_method_return(sbus_req->message);
+    if (reply == NULL) {
+        ret = ENOMEM;
+        goto fail;
+    }
+
+    dbus_message_iter_init_append(reply, &iter);
+
+    dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                                     DBUS_TYPE_STRING_AS_STRING
+                                     DBUS_TYPE_VARIANT_AS_STRING
+                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+                                     &array);
+    if (!dbret) {
+        ret = ENOMEM;
+        goto fail;
+    }
+
+    props = sbus_req->intf->vtable->meta->properties;
+
+    if (props != NULL) {
+        for (i = 0; props[i].name != NULL; i++) {
+            dbret = dbus_message_iter_open_container(&array,
+                                                     DBUS_TYPE_DICT_ENTRY, NULL,
+                                                     &dict);
+            if (!dbret) {
+                ret = ENOMEM;
+                goto fail;
+            }
+
+            /* key */
+            dbret = dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING,
+                                                   &props[i].name);
+            if (!dbret) {
+                ret = ENOMEM;
+                goto fail;
+            }
+
+            /* value */
+            dbret = dbus_message_iter_open_container(&dict, DBUS_TYPE_VARIANT,
+                                                     props[i].type, &variant);
+            if (!dbret) {
+                ret = ENOMEM;
+                goto fail;
+            }
+
+            handler_fn = VTABLE_FUNC(sbus_req->intf->vtable,
+                                     props[i].vtable_offset_get);
+            if (handler_fn == NULL) {
+                ret = ERR_INTERNAL;
+                goto fail;
+            }
+
+            ret = props[i].invoker_get(&variant, sbus_req, handler_fn);
+            if (ret != EOK) {
+                DEBUG(SSSDBG_CRIT_FAILURE,
+                      "Invoker error [%d]: %s\n", ret, sss_strerror(ret));
+                goto fail;
+            }
+
+            dbret = dbus_message_iter_close_container(&dict, &variant);
+            if (!dbret) {
+                ret = EIO;
+                goto fail;
+            }
+
+            dbret = dbus_message_iter_close_container(&array, &dict);
+            if (!dbret) {
+                ret = EIO;
+                goto fail;
+            }
+        }
+    }
+
+    dbret = dbus_message_iter_close_container(&iter, &array);
+    if (!dbret) {
+        ret = EIO;
+        goto fail;
+    }
+
+    sbus_request_finish(sbus_req, reply);
+    return;
+
+fail:
+    DEBUG(SSSDBG_CRIT_FAILURE,
+          "Unable to reply [%d]: %s\n", ret, sss_strerror(ret));
+
+    dbus_message_unref(reply);
+    sbus_request_finish(sbus_req, NULL);
+
+    return;
+}
diff --git a/src/sbus/sssd_dbus_invokers.h b/src/sbus/sssd_dbus_invokers.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fd49859489e79734e33d85bc03d19f8f1cb77ad
--- /dev/null
+++ b/src/sbus/sssd_dbus_invokers.h
@@ -0,0 +1,120 @@
+/*
+    Authors:
+        Pavel Březina <pbrezina@redhat.com>
+
+    Copyright (C) 2014 Red Hat
+
+    SBUS: Interface introspection
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SSSD_DBUS_INVOKER_H_
+#define SSSD_DBUS_INVOKER_H_
+
+#include "sbus/sssd_dbus.h"
+
+int sbus_invoke_get_y(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_b(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_n(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_q(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_i(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_u(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_x(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_t(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_d(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_s(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_o(DBusMessageIter *iter,
+                      struct sbus_request *sbus_req,
+                      void *function_ptr);
+
+int sbus_invoke_get_ay(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_an(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_aq(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_ai(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_au(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_ax(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_at(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_ad(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_as(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+int sbus_invoke_get_ao(DBusMessageIter *iter,
+                       struct sbus_request *sbus_req,
+                       void *function_ptr);
+
+void sbus_invoke_get(struct sbus_request *sbus_req,
+                     const char *type,
+                     sbus_get_invoker_fn invoker_fn,
+                     sbus_msg_handler_fn handler_fn);
+
+void sbus_invoke_get_all(struct sbus_request *sbus_req);
+
+
+#endif /* SSSD_DBUS_INVOKER_H_ */
diff --git a/src/sbus/sssd_dbus_meta.h b/src/sbus/sssd_dbus_meta.h
index e7de9dfdfb4d46e88d3f59f366ca7190a09afc57..83c2f0517790c2be7eb3253a24cf0f040de1d568 100644
--- a/src/sbus/sssd_dbus_meta.h
+++ b/src/sbus/sssd_dbus_meta.h
@@ -21,6 +21,8 @@
 #ifndef _SSSD_DBUS_META_H_
 #define _SSSD_DBUS_META_H_
 
+#include <dbus/dbus.h>
+
 /*
  * Interface metadata
  *
@@ -45,7 +47,14 @@ struct sbus_arg_meta {
 struct sbus_request;
 struct sbus_interface;
 
-typedef int (* sbus_method_invoker_fn)(struct sbus_request *dbus_req, void *handler_fn);
+typedef int (* sbus_get_invoker_fn)(DBusMessageIter *iter,
+                                    struct sbus_request *sbus_req,
+                                    void *handler_fn);
+
+typedef void (* sbus_get_all_invoker_fn)(struct sbus_request *sbus_req);
+
+typedef int (* sbus_method_invoker_fn)(struct sbus_request *sbus_req,
+                                       void *handler_fn);
 
 struct sbus_method_meta {
     const char *name;
@@ -65,7 +74,7 @@ struct sbus_property_meta {
     const char *type;
     int flags;
     size_t vtable_offset_get;
-    sbus_method_invoker_fn invoker_get;
+    sbus_get_invoker_fn invoker_get;
     size_t vtable_offset_set;
     sbus_method_invoker_fn invoker_set;
 };
@@ -80,7 +89,7 @@ struct sbus_interface_meta {
     const struct sbus_method_meta *methods;
     const struct sbus_signal_meta *signals;
     const struct sbus_property_meta *properties;
-    sbus_method_invoker_fn invoker_get_all;
+    sbus_get_all_invoker_fn invoker_get_all;
 };
 
 const struct sbus_method_meta *
diff --git a/src/sbus/sssd_dbus_properties.c b/src/sbus/sssd_dbus_properties.c
index f82dfe731b90ee20cdbe5d4762542ccbc37d744b..20a8f84a1e89dba93caf53748742bf37b38527e2 100644
--- a/src/sbus/sssd_dbus_properties.c
+++ b/src/sbus/sssd_dbus_properties.c
@@ -27,6 +27,7 @@
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
 #include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_invokers.h"
 
 #define CHECK_SIGNATURE(req, error, label, exp) do { \
     const char *__sig; \
@@ -126,11 +127,9 @@ sbus_properties_vtable(void)
     return &iface.vtable;
 }
 
-static int sbus_properties_invoke(struct sbus_request *sbus_req,
-                                  struct sbus_interface *iface,
-                                  sbus_msg_handler_fn handler_fn,
-                                  void *handler_data,
-                                  sbus_method_invoker_fn invoker_fn)
+static struct sbus_request *
+sbus_properties_subreq(struct sbus_request *sbus_req,
+                       struct sbus_interface *iface)
 {
     struct sbus_request *sbus_subreq;
 
@@ -139,20 +138,18 @@ static int sbus_properties_invoke(struct sbus_request *sbus_req,
      * so it is freed together. */
     sbus_subreq = sbus_new_request(sbus_req->conn, iface, sbus_req->message);
     if (sbus_subreq == NULL) {
-        return ENOMEM;
+        return NULL;
     }
 
     talloc_steal(sbus_subreq, sbus_req);
 
-    sbus_request_invoke_or_finish(sbus_subreq, handler_fn, handler_data,
-                                  invoker_fn);
-
-    return EOK;
+    return sbus_subreq;
 }
 
 static int sbus_properties_get(struct sbus_request *sbus_req, void *pvt)
 {
     DBusError *error;
+    struct sbus_request *sbus_subreq;
     struct sbus_connection *conn;
     struct sbus_interface *iface;
     const struct sbus_property_meta *prop;
@@ -204,8 +201,15 @@ static int sbus_properties_get(struct sbus_request *sbus_req, void *pvt)
         goto fail;
     }
 
-    return sbus_properties_invoke(sbus_req, iface, handler_fn,
-                                  iface->instance_data, prop->invoker_get);
+    sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+    if (sbus_subreq == NULL) {
+        error = NULL;
+        goto fail;
+    }
+
+    sbus_invoke_get(sbus_subreq, prop->type,
+                    prop->invoker_get, handler_fn);
+    return EOK;
 
 fail:
     return sbus_request_fail_and_finish(sbus_req, error);
@@ -216,6 +220,7 @@ static int sbus_properties_set(struct sbus_request *sbus_req, void *pvt)
     DBusError *error;
     DBusMessageIter iter;
     DBusMessageIter iter_variant;
+    struct sbus_request *sbus_subreq;
     struct sbus_connection *conn;
     struct sbus_interface *iface;
     const struct sbus_property_meta *prop;
@@ -274,9 +279,17 @@ static int sbus_properties_set(struct sbus_request *sbus_req, void *pvt)
         goto fail;
     }
 
-    return sbus_properties_invoke(sbus_req, iface, handler_fn,
+    sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+    if (sbus_subreq == NULL) {
+        error = NULL;
+        goto fail;
+    }
+
+    sbus_request_invoke_or_finish(sbus_subreq, handler_fn,
                                   iface->instance_data, prop->invoker_set);
 
+    return EOK;
+
 fail:
     return sbus_request_fail_and_finish(sbus_req, error);
 }
@@ -284,6 +297,7 @@ fail:
 static int sbus_properties_get_all(struct sbus_request *sbus_req, void *pvt)
 {
     DBusError *error;
+    struct sbus_request *sbus_subreq;
     struct sbus_connection *conn;
     struct sbus_interface *iface;
     const char *interface_name;
@@ -310,8 +324,15 @@ static int sbus_properties_get_all(struct sbus_request *sbus_req, void *pvt)
         goto fail;
     }
 
-    return sbus_properties_invoke(sbus_req, iface, NULL, NULL,
-                                  iface->vtable->meta->invoker_get_all);
+    sbus_subreq = sbus_properties_subreq(sbus_req, iface);
+    if (sbus_subreq == NULL) {
+        error = NULL;
+        goto fail;
+    }
+
+    iface->vtable->meta->invoker_get_all(sbus_subreq);
+
+    return EOK;
 
 fail:
     return sbus_request_fail_and_finish(sbus_req, error);
diff --git a/src/tests/sbus_codegen_tests_generated.c b/src/tests/sbus_codegen_tests_generated.c
index 502d6ce8a0436d5651e27e0ae6e8b87daa8715e3..210e3e88904168b9c85bba3b144a4b7edb26b2f8 100644
--- a/src/tests/sbus_codegen_tests_generated.c
+++ b/src/tests/sbus_codegen_tests_generated.c
@@ -3,6 +3,7 @@
 #include "util/util.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
+#include "sbus/sssd_dbus_invokers.h"
 #include "sbus_codegen_tests_generated.h"
 
 /* invokes a handler with a 'bu' DBus signature */
@@ -16,27 +17,6 @@ static int invoke_u_method(struct sbus_request *dbus_req, void *function_ptr);
 
 /* invokes a handler with a 'ybnqiuxtdsoayanaqaiauaxatadasao' DBus signature */
 static int invoke_ybnqiuxtdsoayanaqaiauaxatadasao_method(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_s(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_y(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_b(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_n(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_q(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_i(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_u(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_x(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_t(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_d(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_o(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_ay(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_an(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_aq(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_ai(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_au(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_ax(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_at(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_ad(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_as(struct sbus_request *dbus_req, void *function_ptr);
-static int invoke_get_ao(struct sbus_request *dbus_req, void *function_ptr);
 
 /* arguments for com.planetexpress.Ship.MoveUniverse */
 const struct sbus_arg_meta com_planetexpress_Ship_MoveUniverse__in[] = {
@@ -118,63 +98,20 @@ const struct sbus_property_meta com_planetexpress_Ship__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct com_planetexpress_Ship, com_planetexpress_Ship_get_Color),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
     { NULL, }
 };
 
-/* invokes GetAll for the 'com.planetexpress.Ship' interface */
-static int invoke_com_planetexpress_Ship_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-    int ret;
-    struct sbus_interface *intf = dbus_req->intf;
-    const struct sbus_property_meta *property;
-    const char * s_prop_val;
-    const char * s_out_val;
-    void (*s_handler)(struct sbus_request *, void *data, const char * *);
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    property = sbus_meta_find_property(intf->vtable->meta, "Color");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "Color", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for com.planetexpress.Ship */
 const struct sbus_interface_meta com_planetexpress_Ship_meta = {
     "com.planetexpress.Ship", /* name */
     com_planetexpress_Ship__methods,
     com_planetexpress_Ship__signals,
     com_planetexpress_Ship__properties,
-    invoke_com_planetexpress_Ship_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* arguments for com.planetexpress.Pilot.Blink */
@@ -303,7 +240,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,
         offsetof(struct test_pilot, test_pilot_get_FullName),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -312,7 +249,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "y", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_byte),
-        invoke_get_y,
+        sbus_invoke_get_y,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -321,7 +258,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "b", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_boolean),
-        invoke_get_b,
+        sbus_invoke_get_b,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -330,7 +267,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "n", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int16),
-        invoke_get_n,
+        sbus_invoke_get_n,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -339,7 +276,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "q", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint16),
-        invoke_get_q,
+        sbus_invoke_get_q,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -348,7 +285,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "i", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int32),
-        invoke_get_i,
+        sbus_invoke_get_i,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -357,7 +294,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "u", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint32),
-        invoke_get_u,
+        sbus_invoke_get_u,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -366,7 +303,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "x", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int64),
-        invoke_get_x,
+        sbus_invoke_get_x,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -375,7 +312,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "t", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint64),
-        invoke_get_t,
+        sbus_invoke_get_t,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -384,7 +321,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "d", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_double),
-        invoke_get_d,
+        sbus_invoke_get_d,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -393,7 +330,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_string),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -402,7 +339,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "o", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_object_path),
-        invoke_get_o,
+        sbus_invoke_get_o,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -411,7 +348,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "s", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_null_string),
-        invoke_get_s,
+        sbus_invoke_get_s,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -420,7 +357,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "o", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_null_path),
-        invoke_get_o,
+        sbus_invoke_get_o,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -429,7 +366,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "ay", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_byte_array),
-        invoke_get_ay,
+        sbus_invoke_get_ay,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -438,7 +375,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "an", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int16_array),
-        invoke_get_an,
+        sbus_invoke_get_an,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -447,7 +384,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "aq", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint16_array),
-        invoke_get_aq,
+        sbus_invoke_get_aq,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -456,7 +393,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "ai", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int32_array),
-        invoke_get_ai,
+        sbus_invoke_get_ai,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -465,7 +402,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "au", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint32_array),
-        invoke_get_au,
+        sbus_invoke_get_au,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -474,7 +411,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "ax", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_int64_array),
-        invoke_get_ax,
+        sbus_invoke_get_ax,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -483,7 +420,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "at", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_uint64_array),
-        invoke_get_at,
+        sbus_invoke_get_at,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -492,7 +429,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "ad", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_double_array),
-        invoke_get_ad,
+        sbus_invoke_get_ad,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -501,7 +438,7 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "as", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_string_array),
-        invoke_get_as,
+        sbus_invoke_get_as,
         0, /* not writable */
         NULL, /* no invoker */
     },
@@ -510,386 +447,20 @@ const struct sbus_property_meta test_pilot__properties[] = {
         "ao", /* type */
         SBUS_PROPERTY_READABLE,
         offsetof(struct test_pilot, test_pilot_get_object_path_array),
-        invoke_get_ao,
+        sbus_invoke_get_ao,
         0, /* not writable */
         NULL, /* no invoker */
     },
     { NULL, }
 };
 
-/* invokes GetAll for the 'com.planetexpress.Pilot' interface */
-static int invoke_test_pilot_get_all(struct sbus_request *dbus_req, void *function_ptr)
-{
-    DBusMessage *reply;
-    dbus_bool_t dbret;
-    DBusMessageIter iter;
-    DBusMessageIter iter_dict;
-    int ret;
-    struct sbus_interface *intf = dbus_req->intf;
-    const struct sbus_property_meta *property;
-    uint16_t *aq_prop_val;
-    int aq_prop_len;
-    uint16_t *aq_out_val;
-    void (*aq_handler)(struct sbus_request *, void *data, uint16_t * *, int *);
-    bool b_prop_val;
-    dbus_bool_t b_out_val;
-    void (*b_handler)(struct sbus_request *, void *data, bool *);
-    double d_prop_val;
-    double d_out_val;
-    void (*d_handler)(struct sbus_request *, void *data, double *);
-    const char * *ao_prop_val;
-    int ao_prop_len;
-    const char * *ao_out_val;
-    void (*ao_handler)(struct sbus_request *, void *data, const char * * *, int *);
-    int32_t i_prop_val;
-    int32_t i_out_val;
-    void (*i_handler)(struct sbus_request *, void *data, int32_t *);
-    const char * *as_prop_val;
-    int as_prop_len;
-    const char * *as_out_val;
-    void (*as_handler)(struct sbus_request *, void *data, const char * * *, int *);
-    const char * o_prop_val;
-    const char * o_out_val;
-    void (*o_handler)(struct sbus_request *, void *data, const char * *);
-    int16_t n_prop_val;
-    int16_t n_out_val;
-    void (*n_handler)(struct sbus_request *, void *data, int16_t *);
-    uint16_t q_prop_val;
-    uint16_t q_out_val;
-    void (*q_handler)(struct sbus_request *, void *data, uint16_t *);
-    uint8_t *ay_prop_val;
-    int ay_prop_len;
-    uint8_t *ay_out_val;
-    void (*ay_handler)(struct sbus_request *, void *data, uint8_t * *, int *);
-    const char * s_prop_val;
-    const char * s_out_val;
-    void (*s_handler)(struct sbus_request *, void *data, const char * *);
-    uint32_t u_prop_val;
-    uint32_t u_out_val;
-    void (*u_handler)(struct sbus_request *, void *data, uint32_t *);
-    uint64_t t_prop_val;
-    uint64_t t_out_val;
-    void (*t_handler)(struct sbus_request *, void *data, uint64_t *);
-    int64_t *ax_prop_val;
-    int ax_prop_len;
-    int64_t *ax_out_val;
-    void (*ax_handler)(struct sbus_request *, void *data, int64_t * *, int *);
-    uint8_t y_prop_val;
-    uint8_t y_out_val;
-    void (*y_handler)(struct sbus_request *, void *data, uint8_t *);
-    int64_t x_prop_val;
-    int64_t x_out_val;
-    void (*x_handler)(struct sbus_request *, void *data, int64_t *);
-    uint32_t *au_prop_val;
-    int au_prop_len;
-    uint32_t *au_out_val;
-    void (*au_handler)(struct sbus_request *, void *data, uint32_t * *, int *);
-    int16_t *an_prop_val;
-    int an_prop_len;
-    int16_t *an_out_val;
-    void (*an_handler)(struct sbus_request *, void *data, int16_t * *, int *);
-    double *ad_prop_val;
-    int ad_prop_len;
-    double *ad_out_val;
-    void (*ad_handler)(struct sbus_request *, void *data, double * *, int *);
-    int32_t *ai_prop_val;
-    int ai_prop_len;
-    int32_t *ai_out_val;
-    void (*ai_handler)(struct sbus_request *, void *data, int32_t * *, int *);
-    uint64_t *at_prop_val;
-    int at_prop_len;
-    uint64_t *at_out_val;
-    void (*at_handler)(struct sbus_request *, void *data, uint64_t * *, int *);
-
-    reply = dbus_message_new_method_return(dbus_req->message);
-    if (!reply) return ENOMEM;
-    dbus_message_iter_init_append(reply, &iter);
-    dbret = dbus_message_iter_open_container(
-                                     &iter, DBUS_TYPE_ARRAY,
-                                     DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                                     DBUS_TYPE_STRING_AS_STRING
-                                     DBUS_TYPE_VARIANT_AS_STRING
-                                     DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
-                                     &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    property = sbus_meta_find_property(intf->vtable->meta, "FullName");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "FullName", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "byte");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        y_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (y_handler) {
-            (y_handler)(dbus_req, dbus_req->intf->instance_data, &y_prop_val);
-            y_out_val = y_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "byte", DBUS_TYPE_BYTE, &y_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "boolean");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        b_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (b_handler) {
-            (b_handler)(dbus_req, dbus_req->intf->instance_data, &b_prop_val);
-            b_out_val = b_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "boolean", DBUS_TYPE_BOOLEAN, &b_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int16");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        n_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (n_handler) {
-            (n_handler)(dbus_req, dbus_req->intf->instance_data, &n_prop_val);
-            n_out_val = n_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "int16", DBUS_TYPE_INT16, &n_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint16");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        q_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (q_handler) {
-            (q_handler)(dbus_req, dbus_req->intf->instance_data, &q_prop_val);
-            q_out_val = q_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "uint16", DBUS_TYPE_UINT16, &q_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int32");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        i_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (i_handler) {
-            (i_handler)(dbus_req, dbus_req->intf->instance_data, &i_prop_val);
-            i_out_val = i_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "int32", DBUS_TYPE_INT32, &i_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint32");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        u_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (u_handler) {
-            (u_handler)(dbus_req, dbus_req->intf->instance_data, &u_prop_val);
-            u_out_val = u_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "uint32", DBUS_TYPE_UINT32, &u_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int64");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        x_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (x_handler) {
-            (x_handler)(dbus_req, dbus_req->intf->instance_data, &x_prop_val);
-            x_out_val = x_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "int64", DBUS_TYPE_INT64, &x_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint64");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        t_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (t_handler) {
-            (t_handler)(dbus_req, dbus_req->intf->instance_data, &t_prop_val);
-            t_out_val = t_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "uint64", DBUS_TYPE_UINT64, &t_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "double");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        d_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (d_handler) {
-            (d_handler)(dbus_req, dbus_req->intf->instance_data, &d_prop_val);
-            d_out_val = d_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "double", DBUS_TYPE_DOUBLE, &d_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "string");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "string", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "object_path");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        o_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (o_handler) {
-            (o_handler)(dbus_req, dbus_req->intf->instance_data, &o_prop_val);
-            o_out_val = o_prop_val == NULL ? "/" : o_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "object_path", DBUS_TYPE_OBJECT_PATH, &o_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "null_string");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (s_handler) {
-            (s_handler)(dbus_req, dbus_req->intf->instance_data, &s_prop_val);
-            s_out_val = s_prop_val == NULL ? "" : s_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "null_string", DBUS_TYPE_STRING, &s_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "null_path");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        o_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (o_handler) {
-            (o_handler)(dbus_req, dbus_req->intf->instance_data, &o_prop_val);
-            o_out_val = o_prop_val == NULL ? "/" : o_prop_val;
-            ret = sbus_add_variant_to_dict(&iter_dict, "null_path", DBUS_TYPE_OBJECT_PATH, &o_out_val);
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "byte_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        ay_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (ay_handler) {
-            (ay_handler)(dbus_req, dbus_req->intf->instance_data, &ay_prop_val, &ay_prop_len);
-            ay_out_val = ay_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "byte_array", DBUS_TYPE_BYTE, (uint8_t*)ay_out_val, ay_prop_len, sizeof(uint8_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int16_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        an_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (an_handler) {
-            (an_handler)(dbus_req, dbus_req->intf->instance_data, &an_prop_val, &an_prop_len);
-            an_out_val = an_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "int16_array", DBUS_TYPE_INT16, (uint8_t*)an_out_val, an_prop_len, sizeof(int16_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint16_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        aq_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (aq_handler) {
-            (aq_handler)(dbus_req, dbus_req->intf->instance_data, &aq_prop_val, &aq_prop_len);
-            aq_out_val = aq_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "uint16_array", DBUS_TYPE_UINT16, (uint8_t*)aq_out_val, aq_prop_len, sizeof(uint16_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int32_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        ai_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (ai_handler) {
-            (ai_handler)(dbus_req, dbus_req->intf->instance_data, &ai_prop_val, &ai_prop_len);
-            ai_out_val = ai_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "int32_array", DBUS_TYPE_INT32, (uint8_t*)ai_out_val, ai_prop_len, sizeof(int32_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint32_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        au_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (au_handler) {
-            (au_handler)(dbus_req, dbus_req->intf->instance_data, &au_prop_val, &au_prop_len);
-            au_out_val = au_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "uint32_array", DBUS_TYPE_UINT32, (uint8_t*)au_out_val, au_prop_len, sizeof(uint32_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "int64_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        ax_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (ax_handler) {
-            (ax_handler)(dbus_req, dbus_req->intf->instance_data, &ax_prop_val, &ax_prop_len);
-            ax_out_val = ax_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "int64_array", DBUS_TYPE_INT64, (uint8_t*)ax_out_val, ax_prop_len, sizeof(int64_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "uint64_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        at_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (at_handler) {
-            (at_handler)(dbus_req, dbus_req->intf->instance_data, &at_prop_val, &at_prop_len);
-            at_out_val = at_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "uint64_array", DBUS_TYPE_UINT64, (uint8_t*)at_out_val, at_prop_len, sizeof(uint64_t));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "double_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        ad_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (ad_handler) {
-            (ad_handler)(dbus_req, dbus_req->intf->instance_data, &ad_prop_val, &ad_prop_len);
-            ad_out_val = ad_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "double_array", DBUS_TYPE_DOUBLE, (uint8_t*)ad_out_val, ad_prop_len, sizeof(double));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "string_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        as_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (as_handler) {
-            (as_handler)(dbus_req, dbus_req->intf->instance_data, &as_prop_val, &as_prop_len);
-            as_out_val = as_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "string_array", DBUS_TYPE_STRING, (uint8_t*)as_out_val, as_prop_len, sizeof(const char *));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    property = sbus_meta_find_property(intf->vtable->meta, "object_path_array");
-    if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {
-        ao_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);
-        if (ao_handler) {
-            (ao_handler)(dbus_req, dbus_req->intf->instance_data, &ao_prop_val, &ao_prop_len);
-            ao_out_val = ao_prop_val;
-            ret = sbus_add_array_as_variant_to_dict(&iter_dict, "object_path_array", DBUS_TYPE_OBJECT_PATH, (uint8_t*)ao_out_val, ao_prop_len, sizeof(const char *));
-            if (ret != EOK) return ret;
-        }
-    }
-
-    dbret = dbus_message_iter_close_container(&iter, &iter_dict);
-    if (!dbret) return ENOMEM;
-
-    return sbus_request_finish(dbus_req, reply);
-}
-
 /* interface info for com.planetexpress.Pilot */
 const struct sbus_interface_meta test_pilot_meta = {
     "com.planetexpress.Pilot", /* name */
     test_pilot__methods,
     NULL, /* no signals */
     test_pilot__properties,
-    invoke_test_pilot_get_all, /* GetAll invoker */
+    sbus_invoke_get_all, /* GetAll invoker */
 };
 
 /* invokes a handler with a 'bu' DBus signature */
@@ -1038,307 +609,3 @@ static int invoke_ybnqiuxtdsoayanaqaiauaxatadasao_method(struct sbus_request *db
                      arg_20,
                      len_20);
 }
-
-/* invokes a getter with an array of 'uint16_t' DBus type */
-static int invoke_get_aq(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint16_t *prop_val;
-    int prop_len;
-    uint16_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint16_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_UINT16, (uint8_t*)out_val, prop_len, sizeof(uint16_t));
-}
-
-/* invokes a getter with a 'dbus_bool_t' DBus type */
-static int invoke_get_b(struct sbus_request *dbus_req, void *function_ptr)
-{
-    bool prop_val;
-    dbus_bool_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, bool *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_BOOLEAN, &out_val);
-}
-
-/* invokes a getter with a 'double' DBus type */
-static int invoke_get_d(struct sbus_request *dbus_req, void *function_ptr)
-{
-    double prop_val;
-    double out_val;
-
-    void (*handler)(struct sbus_request *, void *data, double *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_DOUBLE, &out_val);
-}
-
-/* invokes a getter with an array of 'const char *' DBus type */
-static int invoke_get_ao(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * *prop_val;
-    int prop_len;
-    const char * *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_OBJECT_PATH, (uint8_t*)out_val, prop_len, sizeof(const char *));
-}
-
-/* invokes a getter with a 'int32_t' DBus type */
-static int invoke_get_i(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int32_t prop_val;
-    int32_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int32_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_INT32, &out_val);
-}
-
-/* invokes a getter with an array of 'const char *' DBus type */
-static int invoke_get_as(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * *prop_val;
-    int prop_len;
-    const char * *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_STRING, (uint8_t*)out_val, prop_len, sizeof(const char *));
-}
-
-/* invokes a getter with a 'const char *' DBus type */
-static int invoke_get_o(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * prop_val;
-    const char * out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val == NULL ? "/" : prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_OBJECT_PATH, &out_val);
-}
-
-/* invokes a getter with a 'int16_t' DBus type */
-static int invoke_get_n(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int16_t prop_val;
-    int16_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int16_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_INT16, &out_val);
-}
-
-/* invokes a getter with a 'uint16_t' DBus type */
-static int invoke_get_q(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint16_t prop_val;
-    uint16_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint16_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_UINT16, &out_val);
-}
-
-/* invokes a getter with an array of 'uint8_t' DBus type */
-static int invoke_get_ay(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint8_t *prop_val;
-    int prop_len;
-    uint8_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint8_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_BYTE, (uint8_t*)out_val, prop_len, sizeof(uint8_t));
-}
-
-/* invokes a getter with a 'const char *' DBus type */
-static int invoke_get_s(struct sbus_request *dbus_req, void *function_ptr)
-{
-    const char * prop_val;
-    const char * out_val;
-
-    void (*handler)(struct sbus_request *, void *data, const char * *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val == NULL ? "" : prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_STRING, &out_val);
-}
-
-/* invokes a getter with a 'uint32_t' DBus type */
-static int invoke_get_u(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint32_t prop_val;
-    uint32_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint32_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_UINT32, &out_val);
-}
-
-/* invokes a getter with a 'uint64_t' DBus type */
-static int invoke_get_t(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint64_t prop_val;
-    uint64_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint64_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_UINT64, &out_val);
-}
-
-/* invokes a getter with an array of 'int64_t' DBus type */
-static int invoke_get_ax(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int64_t *prop_val;
-    int prop_len;
-    int64_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int64_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_INT64, (uint8_t*)out_val, prop_len, sizeof(int64_t));
-}
-
-/* invokes a getter with a 'uint8_t' DBus type */
-static int invoke_get_y(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint8_t prop_val;
-    uint8_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint8_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_BYTE, &out_val);
-}
-
-/* invokes a getter with a 'int64_t' DBus type */
-static int invoke_get_x(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int64_t prop_val;
-    int64_t out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int64_t *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val);
-
-    out_val = prop_val;
-    return sbus_request_return_as_variant(dbus_req, DBUS_TYPE_INT64, &out_val);
-}
-
-/* invokes a getter with an array of 'uint32_t' DBus type */
-static int invoke_get_au(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint32_t *prop_val;
-    int prop_len;
-    uint32_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint32_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_UINT32, (uint8_t*)out_val, prop_len, sizeof(uint32_t));
-}
-
-/* invokes a getter with an array of 'int16_t' DBus type */
-static int invoke_get_an(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int16_t *prop_val;
-    int prop_len;
-    int16_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int16_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_INT16, (uint8_t*)out_val, prop_len, sizeof(int16_t));
-}
-
-/* invokes a getter with an array of 'double' DBus type */
-static int invoke_get_ad(struct sbus_request *dbus_req, void *function_ptr)
-{
-    double *prop_val;
-    int prop_len;
-    double *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, double * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_DOUBLE, (uint8_t*)out_val, prop_len, sizeof(double));
-}
-
-/* invokes a getter with an array of 'int32_t' DBus type */
-static int invoke_get_ai(struct sbus_request *dbus_req, void *function_ptr)
-{
-    int32_t *prop_val;
-    int prop_len;
-    int32_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, int32_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_INT32, (uint8_t*)out_val, prop_len, sizeof(int32_t));
-}
-
-/* invokes a getter with an array of 'uint64_t' DBus type */
-static int invoke_get_at(struct sbus_request *dbus_req, void *function_ptr)
-{
-    uint64_t *prop_val;
-    int prop_len;
-    uint64_t *out_val;
-
-    void (*handler)(struct sbus_request *, void *data, uint64_t * *, int *) = function_ptr;
-
-    (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val, &prop_len);
-
-    out_val = prop_val;
-    return sbus_request_return_array_as_variant(dbus_req, DBUS_TYPE_UINT64, (uint8_t*)out_val, prop_len, sizeof(uint64_t));
-}
-- 
1.7.11.7

