private void generateCollectionAddRemove(
      JType bean, BuilderModel model, BuilderPropertyModel property) {
    if (property.getType().isCollection()
        && model.isGenerateAddRemoveMethodsForIndexedProperties()) {
      SourceTemplate add =
          newSourceTemplate()
              .var("p.name", property.getPropertyName())
              .var("p.addName", property.getPropertyAddName())
              .var("p.type", property.getType().getObjectTypeFullName())
              .var("p.newType", property.getPropertyConcreteType())
              .var("p.genericPart", property.getType().getGenericPartOrEmpty())
              .var("p.valueType", property.getType().getIndexedValueTypeNameOrNull())
              .var("self.type", model.getBuilderSelfType())
              .var("self.getter", model.getBuilderSelfAccessor())
              .pl("public ${self.type} ${p.addName}(final ${p.valueType} val){")
              .pl("	if(this.${p.name} == null){ ")
              .pl("		this.${p.name} = new ${p.newType}${p.genericPart}(); ")
              .pl("	}")
              .pl("	this.${p.name}.add(val);")
              .pl("	return ${self.getter};")
              .pl("}");

      addMethod(bean, add.asMethodNodeSnippet(), model.isMarkGenerated());

      SourceTemplate remove =
          newSourceTemplate()
              .var("p.name", property.getPropertyName())
              .var("p.removeName", property.getPropertyRemoveName())
              .var("p.type", property.getType().getObjectTypeFullName())
              .var("p.newType", property.getPropertyConcreteType())
              .var("p.valueType", property.getType().getIndexedValueTypeNameOrNull())
              .var("self.type", model.getBuilderSelfType())
              .var("self.getter", model.getBuilderSelfAccessor())
              .pl("public ${self.type} ${p.removeName}(final ${p.valueType} val){")
              .pl("	if(this.${p.name} != null){ ")
              .pl("		this.${p.name}.remove(val);")
              .pl("	}")
              .pl("	return ${self.getter};")
              .pl("}");

      addMethod(bean, remove.asMethodNodeSnippet(), model.isMarkGenerated());
    }
  }