diff options
-rw-r--r-- | include/base.h | 14 | ||||
-rw-r--r-- | include/class.h | 28 | ||||
-rw-r--r-- | include/classbase.h | 7 | ||||
-rw-r--r-- | src/classbase.cpp | 3 |
4 files changed, 51 insertions, 1 deletions
diff --git a/include/base.h b/include/base.h index 6cf75df..b9dced2 100644 --- a/include/base.h +++ b/include/base.h @@ -113,6 +113,20 @@ public: } /** + * Overridable method that is called right after an object is cloned + * + * The default implementation does nothing + */ + void __clone() const {} + + /** + * Overridable method that is called right before an object is destructed + * + * The default implementation does nothing + */ + void __destruct() const {} + + /** * Overridable method that is called to check if a property is set * * The default implementation does nothing, and the script will fall back diff --git a/include/class.h b/include/class.h index 9fa14a7..f8e3365 100644 --- a/include/class.h +++ b/include/class.h @@ -235,6 +235,32 @@ private: } /** + * Call the __clone method + * @param base + */ + virtual void callClone(Base *base) const + { + // cast to the user object + T *object = (T *)base; + + // call the method on the base object + return object->__clone(); + } + + /** + * Call the __destruct method + * @param base + */ + virtual void callDestruct(Base *base) const + { + // cast to the user object + T *object = (T *)base; + + // call the method on the base object + return object->__destruct(); + } + + /** * Call a method * @param base Object to call on * @param name Name of the method @@ -247,7 +273,7 @@ private: T *object = (T *)base; // call the method on the base object - return base->__call(name, params); + return object->__call(name, params); } /** diff --git a/include/classbase.h b/include/classbase.h index 0ea6ea4..fac9dbd 100644 --- a/include/classbase.h +++ b/include/classbase.h @@ -150,6 +150,13 @@ protected: virtual int callCompare(Base *object1, Base *object2) const { return 1; } /** + * Call the __clone and __destruct magic methods + * @param base + */ + virtual void callClone(Base *base) const {} + virtual void callDestruct(Base *base) const {} + + /** * Call the __call(), __invoke() or __callStatic() method * @param base Object to call on * @param name Name of the method diff --git a/src/classbase.cpp b/src/classbase.cpp index ec316cd..ccfb9da 100644 --- a/src/classbase.cpp +++ b/src/classbase.cpp @@ -555,6 +555,9 @@ zend_object_value ClassBase::cloneObject(zval *val TSRMLS_DC) // had registered that as a visible method) zend_objects_clone_members(&new_object->php, result, &old_object->php, Z_OBJ_HANDLE_P(val)); + // was a custom clone method installed? If not we call the magic c++ __clone method + if (!entry->clone) meta->callClone(cpp); + // done return result; } |