docs: private InternalFeature convertFeature(Object feature, Geometry geometry, VectorLayer layer,
  			CrsTransform transformation, List<StyleFilter> styles, LabelStyleInfo labelStyle, int featureIncludes)
  			throws GeomajasException {
  		FeatureModel featureModel = layer.getFeatureModel();
  		InternalFeature res = new InternalFeatureImpl();
  		res.setId(featureModel.getId(feature));
  		res.setLayer(layer);
  		res.setGeometry(geometry); // in layer coordinate space for security checks
  		res = attributeService.getAttributes(layer, res, feature); // includes security checks
  
  		if (null != res) {
  			// add and clear data according to the feature includes
  			// unfortunately the data needs to be there for the security tests and can only be removed later
  			if ((featureIncludes & VectorLayerService.FEATURE_INCLUDE_LABEL) != 0) {
  				// value expression takes preference over attribute name
  				String valueExpression = labelStyle.getLabelValueExpression();
  				if (valueExpression != null) {
  					res.setLabel(featureExpressionService.evaluate(valueExpression, res).toString());
  				} else {
  					// must have an attribute name !
  					String labelAttr = labelStyle.getLabelAttributeName();
  					if (LabelStyleInfo.ATTRIBUTE_NAME_ID.equalsIgnoreCase(labelAttr)) {
  						res.setLabel(featureModel.getId(feature));
  					} else {
  						Attribute<?> attribute = res.getAttributes().get(labelAttr);
  						if (null != attribute && null != attribute.getValue()) {
  							res.setLabel(attribute.getValue().toString());
  						}
  					}
  				}
  			}
  			// If allowed, add the geometry (transformed!) to the InternalFeature:
  			if ((featureIncludes & VectorLayerService.FEATURE_INCLUDE_GEOMETRY) != 0) {
  				Geometry transformed;
  				if (null != transformation) {
  					transformed = geoService.transform(geometry, transformation);
  				} else {
  					transformed = geometry;
  				}
  				res.setGeometry(transformed);
  			} else {
  				res.setGeometry(null);
  			}
  
  			// If allowed, add the style definition to the InternalFeature:
  			if ((featureIncludes & VectorLayerService.FEATURE_INCLUDE_STYLE) != 0) {
  				// We calculate the style on the (almost complete) internal feature to allow synthetic attributes.
  				res.setStyleDefinition(findStyleFilter(res, styles).getStyleDefinition());
  			}
  
  			// If allowed, add the attributes to the InternalFeature:
  			if ((featureIncludes & VectorLayerService.FEATURE_INCLUDE_ATTRIBUTES) == 0) {
  				res.setAttributes(null);
  			}
  		}
  
  		return res;
  	}