Added support for batch property setting during element creation
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
index dc773a3..7cfac37 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeInitialiser.java
@@ -10,6 +10,7 @@
 package org.eclipse.epsilon.eol.dom;
 
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalPropertyException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
@@ -51,23 +52,19 @@
 			
 			instance = parameterValues.isEmpty() ? type.createInstance() : type.createInstance(parameterValues);
 			
+			IPropertySetter setter = null;
+			LinkedHashMap<String, Object> properties = new LinkedHashMap<String, Object>();
+			
 			for (Expression parameter : parameters) {
 				if (parameter.getClass() == EqualsOperatorExpression.class) {
 					EqualsOperatorExpression equalsOperatorExpression = (EqualsOperatorExpression) parameter;
 					if (equalsOperatorExpression.getFirstOperand() instanceof NameExpression) {
 						String property = ((NameExpression) equalsOperatorExpression.getFirstOperand()).getName();
-						IPropertySetter setter = context.getIntrospectionManager().getPropertySetterFor(instance, property, context);
+						if (setter == null) setter = context.getIntrospectionManager().getPropertySetterFor(instance, property, context);
+						
 						if (setter != null) {
 							Object value = executorFactory.execute(equalsOperatorExpression.getSecondOperand(), context);
-							try {
-								setter.invoke(instance, property, value, context);
-							}
-							catch (EolRuntimeException eox) {
-								if (eox.getAst() == null) {
-									eox.setAst(this);
-								}
-								throw eox;
-							}
+							properties.put(property, value);
 						}
 						else throw new EolIllegalPropertyException(instance, property, equalsOperatorExpression.getFirstOperand(), context);
 					}
@@ -76,6 +73,19 @@
 					}
 				}
 			}
+			
+			if (setter != null) {
+				try {
+					setter.invoke(instance, properties, context);
+				}
+				catch (EolRuntimeException eox) {
+					if (eox.getAst() == null) {
+						eox.setAst(this);
+					}
+					throw eox;
+				}
+			}
+			
 			return instance;
 		}
 		else if (type instanceof EolTupleType) {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
index c8f3dbc..4bbe3f6 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/introspection/IPropertySetter.java
@@ -10,6 +10,8 @@
  ******************************************************************************/

 package org.eclipse.epsilon.eol.execute.introspection;

 

+import java.util.Map;

+

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.execute.context.IEolContext;

 

@@ -39,4 +41,18 @@
 	default void invoke(Object target, String property, Object value) throws EolRuntimeException {

 		invoke(value, property, value, null);

 	}

+	

+	/**

+	 * Supports batch property setting through 

+	 * e.g. new Person(name="John", surname="Brown")

+	 * @param target

+	 * @param properties

+	 * @since 2.5

+	 */

+	default void invoke(Object target, Map<String, Object> properties, IEolContext context) throws EolRuntimeException {

+		for (String property : properties.keySet()) {

+			invoke(target, property, properties.get(property), context);

+		}

+	}

+	

 }