use custom call instead of call_user_func_array