support dynamic function calls [ci skip]