use RecursiveIteratorIterator
dynamic return part type