public void addSubClass(Clazz clazz) {
    if (subClasses == null) {
      subClasses = new Clazz[1];
    } else {
      // Copy the old elements into new larger array.
      Clazz[] temp = new Clazz[subClasses.length + 1];
      System.arraycopy(subClasses, 0, temp, 0, subClasses.length);
      subClasses = temp;
    }

    subClasses[subClasses.length - 1] = clazz;
  }
  /** The main method for ProGuard. */
  public static void main(String[] args) {
    if (args.length == 0) {
      System.out.println(VERSION);
      System.out.println("Usage: java proguard.ProGuard [options ...]");
      System.exit(1);
    }

    // Create the default options.
    Configuration configuration = new Configuration();

    try {
      // Parse the options specified in the command line arguments.
      ConfigurationParser parser = new ConfigurationParser(args);

      try {
        parser.parse(configuration);
      } finally {
        parser.close();
      }

      // Execute ProGuard with these options.
      new ProGuard(configuration).execute();
    } catch (Exception ex) {
      if (configuration.verbose) {
        // Print a verbose stack trace.
        ex.printStackTrace();
      } else {
        // Print just the stack trace message.
        System.err.println("Error: " + ex.getMessage());
      }

      System.exit(1);
    }

    System.exit(0);
  }