uses argparse