improve argument parser