support variable number of arguments