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.

def changed(self, src, path, dest):
        """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."""
        modified = {path: self.parents[path].updated}

        while True:
            for path in modified:
                if self.parents[path]:
                    mtime = modified.pop(path)
                    for parent in self.parents[path]:
                        modified[parent] = max(mtime,
                                               self.parents[parent].updated)
                    break
            else:
                break

        for path in modified:
            self._build(src, path, dest, modified[path])