introduce fun_traits for extensible function registration