generalise arg passing