support required and optional arguments