remove call_user_func as much as i can