avoid call_user_func_array() if possible