better argument parsing