-static zval *get_parent_proxied_value(zval *object TSRMLS_DC);
-static zval *get_proxied_value(zval *object TSRMLS_DC);
-static zval *read_dimension(zval *object, zval *offset, int type TSRMLS_DC);
-static ZEND_RESULT_CODE cast_proxied_value(zval *object, zval *return_value,
- int type TSRMLS_DC);
-static void write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC);
-static void set_proxied_value(zval **object, zval *value TSRMLS_DC);
+php_property_proxy_object_t *php_property_proxy_object_new_ex(
+ zend_class_entry *ce, php_property_proxy_t *proxy)
+{
+ php_property_proxy_object_t *o;
+
+ if (!ce) {
+ ce = php_property_proxy_class_entry;
+ }
+
+ o = ecalloc(1, sizeof(*o) + sizeof(zval) * (ce->default_properties_count - 1));
+ zend_object_std_init(&o->zo, ce);
+ object_properties_init(&o->zo, ce);
+
+ o->proxy = proxy;
+ o->zo.handlers = &php_property_proxy_object_handlers;
+
+ debug_propro(0, "init", o, NULL, NULL);
+
+ return o;
+}
+
+zend_object *php_property_proxy_object_new(zend_class_entry *ce)
+{
+ return &php_property_proxy_object_new_ex(ce, NULL)->zo;
+}
+
+static void destroy_obj(zend_object *object)
+{
+ php_property_proxy_object_t *o = PHP_PROPRO_PTR(object);
+
+ debug_propro(0, "dtor", o, NULL, NULL);
+
+ if (o->proxy) {
+ php_property_proxy_free(&o->proxy);
+ }
+ if (!Z_ISUNDEF(o->parent)) {
+ zval_ptr_dtor(&o->parent);
+ ZVAL_UNDEF(&o->parent);
+ }
+ zend_object_std_dtor(object);
+}
+
+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;