String determinePackageName(int uniqueRound) {
    if (this.meta.size() == 1) {
      AddressTemplate address = this.meta.get(0).getAddress();

      int numTokens = address.tokenLength() - 1;

      List<String> segments = determineSegments(address, uniqueRound);

      return packagize(segments);
    }

    List<List<String>> allSegments = new ArrayList<>();

    for (ResourceMetaData resourceMetaData : this.meta) {
      allSegments.add(determineSegments(resourceMetaData.getAddress(), uniqueRound));
    }

    List<String> commonSegments = new ArrayList<>();

    int i = 0;
    OUTER:
    while (true) {

      String cur = null;

      INNER:
      for (List<String> each : allSegments) {
        if (!(each.size() > i)) {
          break OUTER;
        }

        if (cur == null) {
          cur = each.get(i);
        } else {
          if (!cur.equals(each.get(i))) {
            break OUTER;
          }
        }
      }

      commonSegments.add(cur);
      cur = null;
      ++i;
    }

    return packagize(commonSegments);
  }
  /**
   * Construct a class plan for set of identical resources.
   *
   * @param meta
   */
  ClassPlan(List<ResourceMetaData> meta) {

    // type assertion to make things more obvious
    ResourceMetaData prime = meta.get(0);
    String primeType = prime.getAddress().getResourceType();
    meta.forEach(
        resourceMetaData -> {
          String resourceType = resourceMetaData.getAddress().getResourceType();
          if (!resourceType.equals(primeType))
            throw new IllegalArgumentException(
                "Illegal partition, resourceType's don't match: "
                    + primeType
                    + " > "
                    + resourceType);
        });

    this.meta.addAll(meta);
    this.addr = prime.getAddress();
    this.packageName = determinePackageName(0);
    this.originalClassName = determineClassName(0);
    this.className = NameFixer.fixClassName(this.originalClassName);

    this.type = addr.getResourceType();
  }