<slide>
<title>Collection: Add Interface Handlers</title>

<blurb>%Zend/zend_collection.c%</blurb>

<div effect="fade-in">
<example class="small"><![CDATA[
static int zend_implement_collection(zend_class_entry *interface, zend_class_entry *class_type)
{
       if (class_type->ce_flags & ZEND_ACC_COLLECTION) {
               return SUCCESS;
       }

       zend_error_noreturn(E_ERROR, "Non-collection class %s cannot implement interface %s",
               ZSTR_VAL(class_type->name),
               ZSTR_VAL(interface->name));

       return FAILURE;
}
]]></example>
</div>

<div effect="fade-in">
<example class="small"><![CDATA[
void zend_register_collection_ce(void)
{
       zend_ce_collection = register_class_Collection();
       zend_ce_collection->interface_gets_implemented = zend_implement_collection;

       memcpy(&zend_collection_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
       zend_collection_object_handlers.clone_obj = NULL;
       zend_collection_object_handlers.compare = zend_objects_not_comparable;
}
]]></example>
</div>

<div effect="fade-in">
<example class="small"><![CDATA[
void zend_collection_add_interfaces(zend_class_entry *ce)
{
       uint32_t num_interfaces_before = ce->num_interfaces;

       ce->num_interfaces++;

       ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_RESOLVED_INTERFACES));

       ce->interface_names = erealloc(ce->interface_names, sizeof(zend_class_name) * ce->num_interfaces);

       ce->interface_names[num_interfaces_before].name = zend_string_copy(zend_ce_collection->name);
       ce->interface_names[num_interfaces_before].lc_name = ZSTR_INIT_LITERAL("collection", 0);

       ce->default_object_handlers = &zend_collection_object_handlers;
}
]]></example>
</div>

</slide>
