private Map getFields(XClass clazz, String prefix) throws XDocletException {
    Map fields = new LinkedHashMap();

    Collection curFields = clazz.getMethods(true);

    for (Iterator iterator = curFields.iterator(); iterator.hasNext(); ) {
      XMethod setter = (XMethod) iterator.next();

      if (MethodTagsHandler.isSetterMethod(setter)) {
        String name = MethodTagsHandler.getPropertyNameFor(setter);
        XParameter param = (XParameter) setter.getParameters().iterator().next();
        String type = param.getType().getQualifiedName();
        XMethod getter = setter.getAccessor();

        setCurrentClass(setter.getContainingClass());
        super.setCurrentMethod(getter);
        Properties pro = new Properties();
        pro.setProperty("tagName", "hibernate.component");

        if (super.hasTag(pro, FOR_METHOD)) {
          name += "Form";
          fields.putAll(getFields(param.getType(), prefix + name + "."));
        } else {
          fields.put(prefix + name, setter);
        }
      }
    }

    return fields;
  }
 /**
  * Method methodTagValue
  *
  * @param attributes
  * @return
  * @throws XDocletException
  */
 public String methodTagValue(Properties attributes) throws XDocletException {
   XMethod method = getCurrentMethod();
   setCurrentMethod(method.getAccessor());
   String value = getTagValue(attributes, FOR_METHOD);
   setCurrentMethod(method);
   return value;
 }
  /**
   * Iterates the body for each field of the current form requiring validation.
   *
   * @param template
   * @param attributes
   * @throws XDocletException
   */
  public void forAllFields(String template, Properties attributes) throws XDocletException {
    XClass clazz = getCurrentClass();
    Map setters = new LinkedHashMap(getFields(clazz));

    for (Iterator iterator = setters.keySet().iterator(); iterator.hasNext(); ) {
      curFieldName = (String) iterator.next();

      XMethod field = (XMethod) setters.get(curFieldName);

      XMethod getter = field.getAccessor();
      setCurrentMethod(getter);
      curFieldIsIdorVersion = false;
      Properties prop = new Properties();
      prop.setProperty("tagName", "hibernate.id");

      if (hasTag(prop, FOR_METHOD)) {
        prop.setProperty("paramName", "generator-class");
        String generatorClass = methodTagValue(prop);
        System.out.println("generatorClass: " + generatorClass);
        if (generatorClass != null && generatorClass.equals("assigned")) {
          curFieldIsIdorVersion = false;
        } else {
          curFieldIsIdorVersion = true;
        }
      } else {
        curFieldIsIdorVersion = false;
      }

      prop.setProperty("tagName", "hibernate.version");

      if (hasTag(prop, FOR_METHOD)) {
        curFieldIsIdorVersion = true;
      }

      String typename = field.getPropertyType().getType().getQualifiedName();
      curFieldIsBoolean = typename.equals("boolean") || typename.equals("java.lang.Boolean");
      curFieldIsDate = typename.equals("java.util.Date") || typename.equals("java.sql.Timestamp");

      curType = typename;
      setCurrentMethod(field);

      if (!iterator.hasNext()) {
        lastField = true;
      } else {
        lastField = false;
      }

      generate(template);
    }
  }