private Object invokeTheFunction(List<String> names, FEELFunction fn, EvaluationContext ctx, Object[] params) {
if (names.size() == 1) {
Object result = fn.invokeReflectively(ctx, params);
return result;
} else {
try {
Object newRoot = ctx.getValue(names.get(0));
ctx.enterFrame();
try {
Map<String, Object> asMap = ((Map<String, Object>) newRoot);
asMap.forEach(ctx::setValue);
} catch (ClassCastException e) {
ctx.setRootObject(newRoot);
}
return invokeTheFunction(names.subList(1, names.size()), fn, ctx, params);
} finally {
ctx.exitFrame();
}
}
}