'Yield myself, then each of my children, and each of those children\'s
children in turn.
The optional argument C{descend} is a predicate that takes a FilePath,
and determines whether or not that FilePath is traversed/descended
into.  It will be called with each path for which C{isdir} returns
C{True}.  If C{descend} is not specified, all directories will be
traversed (including symbolic links which refer to directories).
@param descend: A one-argument callable that will return True for
FilePaths that should be traversed, False otherwise.
@return: a generator yielding FilePath-like objects.'

def walk(self, descend=None):

    (yield self)
    if self.isdir():
        for c in self.children():
            if ((descend is None) or descend(c)):
                for subc in c.walk(descend):
                    if os.path.realpath(self.path).startswith(os.path.realpath(subc.path)):
                        raise LinkError('Cycle    in    file    graph.')
                    (yield subc)
            else:
                (yield c)
