+#endif /* DOXYGEN */
+
+/**
+ * The internal property proxy.
+ *
+ * Container for the object/array holding the proxied property.
+ */
+struct php_property_proxy {
+ /** The container holding the property */
+ zval container;
+ /** The name of the proxied property */
+ zend_string *member;
+};
+typedef struct php_property_proxy php_property_proxy_t;
+
+/**
+ * The userland object.
+ *
+ * Return an object instance of php\\PropertyProxy to make your C-struct
+ * member accessible by reference from PHP userland.
+ *
+ * Example:
+ * ~~~~~~~~~~{.c}
+ * static zval *my_read_prop(zval *object, zval *member, int type, void **cache_slot, zval *tmp)
+ * {
+ * zval *return_value;
+ * zend_string *member_name = zval_get_string(member);
+ * my_prophandler_t *handler = my_get_prophandler(member_name);
+ *
+ * if (!handler || type == BP_VAR_R || type == BP_VAR_IS) {
+ * return_value = zend_get_std_object_handlers()->read_property(object, member, type, cache_slot, tmp);
+ *
+ * if (handler) {
+ * handler->read(object, tmp);
+ *
+ * zval_ptr_dtor(return_value);
+ * ZVAL_COPY_VALUE(return_value, tmp);
+ * }
+ * } else {
+ * return_value = php_property_proxy_zval(object, member_name);
+ * }
+ *
+ * zend_string_release(member_name);
+ *
+ * return return_value;
+ * }
+ * ~~~~~~~~~~
+ */
+struct php_property_proxy_object {
+ /** The actual property proxy */