+ return (zend_object *) new_propro(ce, NULL TSRMLS_CC);
+}
+
+static void destroy_obj(zend_object *object TSRMLS_DC)
+{
+ php_property_proxy_object_t *o = (php_property_proxy_object_t *) object;
+
+ debug_propro(0, "dtor", o, NULL, NULL TSRMLS_CC);
+
+ if (o->proxy) {
+ php_property_proxy_free(&o->proxy);
+ }
+ if (!Z_ISUNDEF(o->parent)) {
+ zval_ptr_dtor(&o->parent);
+ ZVAL_UNDEF(&o->parent);
+ }
+}
+
+static inline php_property_proxy_object_t *get_propro(zval *object)
+{
+ object = get_referenced_zval(object);
+ switch (Z_TYPE_P(object)) {
+ case IS_OBJECT:
+ break;
+
+ EMPTY_SWITCH_DEFAULT_CASE();
+ }
+ return (php_property_proxy_object_t *) Z_OBJ_P(object);
+}
+
+static inline zend_bool got_value(zval *container, zval *value TSRMLS_DC)
+{
+ zval identical;
+
+ if (!Z_ISUNDEF_P(value)) {
+ if (SUCCESS == is_identical_function(&identical, value, container TSRMLS_CC)) {
+ if (Z_TYPE(identical) != IS_TRUE) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static zval *get_parent_proxied_value(zval *object, zval *return_value TSRMLS_DC)
+{
+ php_property_proxy_object_t *obj;
+
+ obj = get_propro(object);
+ debug_propro(1, "parent_get", obj, NULL, NULL TSRMLS_CC);