'Generate a 4-tuple `(partname, blob, reltype, srels)` for each of the
parts in *phys_reader* by walking the relationship graph rooted at
srels.'

@staticmethod
def _walk_phys_parts(phys_reader, srels, visited_partnames=None):

    if (visited_partnames is None):
        visited_partnames = []
    for srel in srels:
        if srel.is_external:
            continue
        partname = srel.target_partname
        if (partname in visited_partnames):
            continue
        visited_partnames.append(partname)
        reltype = srel.reltype
        part_srels = PackageReader._srels_for(phys_reader, partname)
        blob = phys_reader.blob_for(partname)
        (yield (partname, blob, reltype, part_srels))
        next_walker = PackageReader._walk_phys_parts(phys_reader, part_srels, visited_partnames)
        for (partname, blob, reltype, srels) in next_walker:
            (yield (partname, blob, reltype, srels))
