public static boolean invokeMethod(Method setterMethod, Method getterMethod, Object instance, Class<?> paramType, String attributeKey, String value) {
		try {
			if (Integer.class.equals(paramType) || int.class.equals(paramType) || IntegerProperty.class.equals(paramType)) {
				setterMethod.invoke(instance, Integer.parseInt(value));
			} else if (String.class.equals(paramType))
				setterMethod.invoke(instance, value);
			else if (Boolean.class.equals(paramType) || boolean.class.equals(paramType))
				setterMethod.invoke(instance, Boolean.parseBoolean(value));
			else if (Float.class.equals(paramType) || float.class.equals(paramType))
				setterMethod.invoke(instance, Float.parseFloat(value));
			else if (Double.class.equals(paramType) || double.class.equals(paramType) || DoubleProperty.class.equals(paramType))
				setterMethod.invoke(instance, Double.parseDouble(value));
			else if (Map.class.equals(paramType)) {
				if (LOTDConstants.GAME_OBJECT_KEY_UNIT_DAMAGE.equals(attributeKey) || LOTDConstants.GAME_OBJECT_KEY_UNIT_RESISTANCE.equals(attributeKey)) {
					String[] split = value.split(Pattern.quote((".")));
					if (split.length == 2 && getterMethod != null) {
						@SuppressWarnings("unchecked")
						Map<ElementType, Integer> currentDamageOrResistance = (Map<ElementType, Integer>) getterMethod.invoke(instance);
						currentDamageOrResistance.put(ElementType.valueOf(split[0]), Integer.parseInt(split[1]));
					} else
						throw new Exception("Wrong format to initialize attribute of type 'Damage' or 'Resistance'. Requires a correct getterMethod ('" + getterMethod + "') and correct valueString ('" + value + "') to initialize");
				}
			} else if (Set.class.equals(paramType)) {
				if (LOTDConstants.GAME_OBJECT_KEY_UNIT_ABILITIES.equals(attributeKey) || LOTDConstants.GAME_OBJECT_KEY_ITEM_ABILITIES.equals(attributeKey)) {
					String[] splits = value.split(Pattern.quote(","));
					for (String split : splits) {
						Ability ability = GameLogic.INSTANCE.createAbility(AbilityType.valueOf(split));
						if (instance instanceof Item)
							((Item) instance).getAbilities().add(ability);
						else if (instance instanceof Unit)
							UnitUtil.addAbility((Unit) instance, ability);
						else
							throw new Exception("Unsupported objectType to initialize 'abilities' attribute: " + instance);
					}
				}
			} else if (ItemCategory.class.equals(paramType))
				setterMethod.invoke(instance, ItemCategory.valueOf(value));
			else if (TargetCategory.class.equals(paramType))
				setterMethod.invoke(instance, TargetCategory.valueOf(value));
			else
				throw new Exception("Unsupported paramType for method 'invokeMethod': " + paramType);

			return true;
		} catch (Exception e) {
			LOGGER.fatal("Method '" + setterMethod + "' could not be invoked for the instance '" + instance + "' with value '" + value + "' and type '" + paramType + "'", e);
		}

		return false;
	}