def changed(self, src, path, dest):
modified = {path: self.parents[path].updated}<EOL>while True:<EOL><INDENT>for path in modified:<EOL><INDENT>if self.parents[path]:<EOL><INDENT>mtime = modified.pop(path)<EOL>for parent in self.parents[path]:<EOL><INDENT>modified[parent] = max(mtime,<EOL>self.parents[parent].updated)<EOL><DEDENT>break<EOL><DEDENT><DEDENT>else:<EOL><INDENT>break<EOL><DEDENT><DEDENT>for path in modified:<EOL><INDENT>self._build(src, path, dest, modified[path])<EOL><DEDENT>
If `path` does not have any parents, it is built. Otherwise, it will
        attempt to build every parent of `path` (or their parents). Output file
        modification times are taken into account to prevent unnecessary
        builds.