struct Ecore_Object { Ecore_Iter *(*iter)(void); } sturct Ecore_List { Ecore_Object obj; ... } struct Ecore_Iter { void *(*next)(void *list); void *(*prev)(void *list); void *(*first)(void *list); } Ecore_Iter *ecore_iterator_new(void *list) { return (ECORE_OBJECT(list)->iter()); } iter = ecore_iterator_new(my_dlist); while (iter->next) { } iter = ecore_iterator_new(my_tree) while (iter->next) { }