add Functor constraint