Función dinámica de llamada con parámetros dinámicos en Javascript [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Pasar una matriz como un parámetro de función en JavaScript 10 respuestas Pasar argumentos a otra función de JavaScript [duplicado] 3 respuestas

Estoy buscando un truco sobre esto. Sé cómo llamar a una función dinámica y arbitraria en Javascript, pasando parámetros específicos, algo como esto:

function mainfunc (func, par1, par2){
    window[func](par1, par2);
}

function calledfunc(par1, par2){
    // Do stuff here
}

mainfunc('calledfunc','hello','bye');

Sé cómo pasar parámetros opcionales ilimitados utilizando la colección de argumentos [] dentro de mainfunc, pero no puedo entender cómo enviar un número arbitrario de parámetros a mainfunc para ser enviado a calledfunc dinámicamente; ¿Cómo puedo lograr algo como esto, pero con cualquier número de argumentos opcionales (sin usar esa fea if-else)? :

function mainfunc (func){
    if(arguments.length == 3)
        window[func](arguments[1], arguments[2]);
    elseif(arguments.length == 4)
        window[func](arguments[1], arguments[2], arguments[3]);
    elseif(arguments.length == 5)
        window[func](arguments[1], arguments[2], arguments[3], arguments[4]);
}

function calledfunc1(par1, par2){
    // Do stuff here
}

function calledfunc2(par1, par2, par3){
    // Do stuff here
}

mainfunc('calledfunc1','hello','bye');
mainfunc('calledfunc2','hello','bye','goodbye');