use sm call instead of call_user_func