flexible function type-based overloading