diff --git a/gi/object.c b/gi/object.c
index 531254e..135b880 100644
--- a/gi/object.c
+++ b/gi/object.c
@@ -113,33 +113,18 @@ init_g_param_from_property(JSContext  *context,
     return VALUE_WAS_SET;
 }
 
-/* a hook on getting a property; set value_p to override property's value.
- * Return value is JS_FALSE on OOM/exception.
- */
 static JSBool
-object_instance_get_prop(JSContext *context,
-                         JSObject  *obj,
-                         jsval      id,
-                         jsval     *value_p)
+get_prop_from_g_param(JSContext      *context,
+                      JSObject       *obj,
+                      ObjectInstance *priv,
+                      const char     *name,
+                      jsval          *value_p)
+
 {
-    ObjectInstance *priv;
-    const char *name;
     char *gname;
     GParamSpec *param;
     GValue gvalue = { 0, };
 
-    if (!gjs_get_string_id(id, &name))
-        return JS_TRUE; /* not resolved, but no error */
-
-    priv = priv_from_js(context, obj);
-    gjs_debug_jsprop(GJS_DEBUG_GOBJECT,
-                     "Get prop '%s' hook obj %p priv %p", name, obj, priv);
-
-    if (priv == NULL)
-        return JS_FALSE; /* wrong class passed in */
-    if (priv->gobj == NULL)
-        return JS_TRUE; /* prototype, not an instance. */
-
     gname = gjs_hyphen_from_camel(name);
     param = g_object_class_find_property(G_OBJECT_GET_CLASS(priv->gobj),
                                          gname);
@@ -170,6 +155,60 @@ object_instance_get_prop(JSContext *context,
     return JS_TRUE;
 }
 
+/* a hook on getting a property; set value_p to override property's value.
+ * Return value is JS_FALSE on OOM/exception.
+ */
+static JSBool
+object_instance_get_prop(JSContext *context,
+                         JSObject  *obj,
+                         jsval      id,
+                         jsval     *value_p)
+{
+    ObjectInstance *priv;
+    const char *name;
+    jsval override;
+    gboolean success;
+
+    if (!gjs_get_string_id(id, &name))
+        return JS_TRUE; /* not resolved, but no error */
+
+    priv = priv_from_js(context, obj);
+    gjs_debug_jsprop(GJS_DEBUG_GOBJECT,
+                     "Get prop '%s' hook obj %p priv %p", name, obj, priv);
+
+    if (priv == NULL)
+        return JS_FALSE; /* wrong class passed in */
+    if (priv->gobj == NULL)
+        return JS_TRUE; /* prototype, not an instance. */
+
+    override = JSVAL_VOID;
+    JS_AddRoot(context, &override);
+    success = get_prop_from_g_param(context, obj, priv, name, &override);
+    if (!success)
+        goto out;
+
+    if (override != JSVAL_VOID) {
+        *value_p = override;
+        goto out;
+    }
+
+#if 0
+    /* To be added, fall back to fields */
+    success = get_prop_from_field(context, obj, priv, name, &override);
+    if (!success)
+        goto out;
+
+    if (override != JSVAL_VOID) {
+        *value_p = override;
+        goto out;
+    }
+#endif
+
+ out:
+    JS_RemoveRoot(context, &override);
+    return success;
+}
+
 /* a hook on setting a property; set value_p to override property value to
  * be set. Return value is JS_FALSE on OOM/exception.
  */
