summaryrefslogtreecommitdiff
path: root/src/classbase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/classbase.cpp')
-rw-r--r--src/classbase.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/classbase.cpp b/src/classbase.cpp
index fe08bd1..8926b3e 100644
--- a/src/classbase.cpp
+++ b/src/classbase.cpp
@@ -359,6 +359,30 @@ zend_object_value ClassBase::createObject(zend_class_entry *entry TSRMLS_DC)
}
/**
+ * Function to create a new iterator to iterate over an object
+ * @param entry The class entry
+ * @param object The object to iterate over
+ * @param by_ref ?????
+ * @return zend_object_iterator* Pointer to the iterator
+ */
+zend_object_iterator *ClassBase::getIterator(zend_class_entry *entry, zval *object, int by_ref)
+{
+ std::cout << "call to getIterator" << std::endl;
+
+ // by-ref is not possible (copied from SPL)
+ if (by_ref) throw Php::Exception("Foreach by ref is not possible");
+
+ // retrieve the traversable object
+ Traversable *traversable = dynamic_cast<Traversable*>(cpp_object(object));
+
+ // create an iterator
+ auto *iterator = traversable->getIterator();
+
+ // return the implementation
+ return iterator->implementation();
+}
+
+/**
* Destructor
*/
ClassBase::~ClassBase()
@@ -436,6 +460,10 @@ void ClassBase::initialize(const std::string &prefix)
// we need a special constructor
entry.create_object = &ClassBase::createObject;
+ // and a special function for retrieving the iterator (but only if this is
+ // a traversable class)
+ if (traversable()) entry.get_iterator = &ClassBase::getIterator;
+
// register the class
_entry = zend_register_internal_class(&entry TSRMLS_CC);