struct Ecore_Object { Ecore_Iter_Interface *iter_interface; } sturct Ecore_List { Ecore_Object obj; ... } struct Ecore_Iter_Interface { Ecore_Iter *(*instance)(void *list); void *(*free)(Ecore_Iter *iter); void *(*next)(Ecore_Iter *iter); void *(*prev)(Ecore_Iter *iter); void *(*first)(Ecore_Iter *iter); } Ecore_List *ecore_list_new() { ... if (!list_iter_interface) { list_iter_interface = NEW(Ecore_Iter_Interface); list_iter_interface->instance = ecore_list_iterator_new; list_iter_interface->free = ecore_list_iterator_free; list_iter_interface->next = ecore_list_iterator_next; list_iter_interface->prev = ecore_list_iterator_prev; list_iter_interface->first = ecore_list_iterator_first; } list->obj.iter = list_iter; ... } struct Ecore_List_Iterator { Ecore_List *list_head; Ecore_List_Node *current; } Ecore_Iter *ecore_iterator_new(void *list) { return (ECORE_OBJECT(list)->iter_interface->instance(list)); } Ecore_Iter *ecore_list_iterator_new(void *list) { iter = NEW(Ecore_List_Iterator); iter->list = list; /* Register with list for maintaining consistency */ ... return iter; } iter = ecore_iterator_new(my_dlist); while (value = ecore_iterator_next(iter)) { } ecore_iterator_free(iter); iter = ecore_iterator_new(my_tree) while (value = ecore_iterator_next(iter)) { } ecore_iterator_free(iter);