private void generateBuildMethod(JType builder, BuilderModel model) {
    if (!model.isSupportSubclassing()) {
      SourceTemplate buildMethod =
          newSourceTemplate()
              .var("b.type", model.getPojoType().getSimpleName())
              .var("buildName", model.getBuildPojoMethodName())
              .pl("public ${b.type} ${buildName}(){")
              .p("	return new ${b.type}(");

      boolean comma = false;
      for (BuilderPropertyModel property : model.getProperties()) {
        if (property.isReadOnly()) {
          continue;
        }
        if (comma) {
          buildMethod.p(",");
        }
        buildMethod.p("this." + property.getPropertyName());
        comma = true;
      }
      buildMethod.pl(");");
      buildMethod.pl("}");
      addMethod(builder, buildMethod.asMethodNodeSnippet(), model.isMarkGenerated());
    }
  }
  private void generateAllArgCtor(JType beanType, BuilderModel model) {
    if (!beanType.isAbstract()) {
      SourceTemplate beanCtor =
          newSourceTemplate()
              .var("b.name", model.getPojoType().getSimpleNameRaw())
              .pl("private ${b.name} (");

      boolean comma = false;
      // args
      for (BuilderPropertyModel property : model.getProperties()) {
        if (property.isReadOnly()) {
          continue;
        }
        if (comma) {
          beanCtor.p(",");
        }
        if (model.isMarkCtorArgsAsProperties()) {
          beanCtor.p(
              "@" + Property.class.getName() + "(name=\"" + property.getPropertyName() + "\") ");
        }
        beanCtor.p(property.getType().getFullName() + " " + property.getPropertyName());
        comma = true;
      }

      beanCtor.pl("){");
      // field assignments
      for (BuilderPropertyModel property : model.getProperties()) {
        if (property.isReadOnly()) {
          continue;
        }
        // TODO:figure out if we can set field directly, via setter, or via ctor args
        // for now assume a setter
        if (property.isFromSuperClass()) {
          beanCtor.pl(property.getPropertySetterName() + "(" + property.getPropertyName() + ");");
        } else {
          beanCtor.pl("this." + property.getFieldName() + "=" + property.getPropertyName() + ";");
        }
        comma = true;
      }
      beanCtor.pl("}");
      addMethod(beanType, beanCtor.asConstructorNodeSnippet(), model.isMarkGenerated());
    }
  }