/** Computes the latest module builds that correspond to this build. */
  public Map<IvyModule, IvyBuild> getModuleLastBuilds() {
    Collection<IvyModule> mods = getParent().getModules();

    // identify the build number range. [start,end)
    IvyModuleSetBuild nb = getNextBuild();
    int end = nb != null ? nb.getNumber() : Integer.MAX_VALUE;

    // preserve the order by using LinkedHashMap
    Map<IvyModule, IvyBuild> r = new LinkedHashMap<IvyModule, IvyBuild>(mods.size());

    for (IvyModule m : mods) {
      IvyBuild b = m.getNearestOldBuild(end - 1);
      if (b != null && b.getNumber() >= getNumber()) r.put(m, b);
    }

    return r;
  }
  /**
   * Finds {@link Action}s from all the module builds that belong to this {@link IvyModuleSetBuild}.
   * One action per one {@link IvyModule}, and newer ones take precedence over older ones.
   */
  public <T extends Action> List<T> findModuleBuildActions(Class<T> action) {
    Collection<IvyModule> mods = getParent().getModules();
    List<T> r = new ArrayList<T>(mods.size());

    // identify the build number range. [start,end)
    IvyModuleSetBuild nb = getNextBuild();
    int end = nb != null ? nb.getNumber() - 1 : Integer.MAX_VALUE;

    for (IvyModule m : mods) {
      IvyBuild b = m.getNearestOldBuild(end);
      while (b != null && b.getNumber() >= number) {
        T a = b.getAction(action);
        if (a != null) {
          r.add(a);
          break;
        }
        b = b.getPreviousBuild();
      }
    }

    return r;
  }