public String[] save() {
    ArrayList<String> lines = new ArrayList<String>();
    Field[] fields = getClass().getDeclaredFields();
    lines.add("<config>");
    for (Field f : fields) {
      if (isConfigItem(f)) {
        Object obj;
        try {
          f.setAccessible(true);
          obj = f.get(this);
        } catch (IllegalAccessException e) {
          e.printStackTrace();
          continue;
        }
        if (obj instanceof ConfigParser) {
          lines.add("<" + f.getName() + ">");
          ConfigParser parser = (ConfigParser) obj;
          parser.save(lines);
          lines.add("</" + f.getName() + ">");
        } else {
          String item_name = f.getName();
          if (!Modifier.isTransient(f.getModifiers())) {
            lines.add("<" + item_name + ">" + obj.toString() + "</" + item_name + ">");
          }
        }
      }
    }
    lines.add("</config>");

    return lines.toArray(new String[lines.size()]);
  }