class argHandler(dict):
    #A super duper fancy custom made CLI argument handler!!
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__
    _descriptions = {'help, --h, -h': 'show this super helpful message and exit'}
    
    def setDefaults(self):
        self.define('imgdir', './sample_img/', 'path to testing directory with images')
        self.define('binary', './bin/', 'path to .weights directory')
        self.define('config', './cfg/', 'path to .cfg directory')
        self.define('dataset', '../pascal/VOCdevkit/IMG/', 'path to dataset directory')
        self.define('labels', 'labels.txt', 'path to labels file')
        self.define('backup', './ckpt/', 'path to backup folder')
        self.define('summary', '', 'path to TensorBoard summaries directory')
        self.define('annotation', '../pascal/VOCdevkit/ANN/', 'path to annotation directory')
        self.define('threshold', -0.1, 'detection threshold')
        self.define('model', '', 'configuration of choice')
        self.define('trainer', 'rmsprop', 'training algorithm')
        self.define('momentum', 0.0, 'applicable for rmsprop and momentum optimizers')
        self.define('verbalise', True, 'say out loud while building graph')
        self.define('train', False, 'train the whole net')
        self.define('load', '', 'how to initialize the net? Either from .weights or a checkpoint, or even from scratch')
        self.define('savepb', False, 'save net and weight to a .pb file')
        self.define('gpu', 0.0, 'how much gpu (from 0.0 to 1.0)')
        self.define('gpuName', '/gpu:0', 'GPU device name')
        self.define('lr', 1e-5, 'learning rate')
        self.define('keep',20,'Number of most recent training results to save')
        self.define('batch', 16, 'batch size')
        self.define('epoch', 1000, 'number of epoch')
        self.define('save', 2000, 'save checkpoint every ? training examples')
        self.define('demo', '', 'demo on webcam')
        self.define('queue', 1, 'process demo in batch')
        self.define('json', False, 'Outputs bounding box information in json format.')
        self.define('saveVideo', False, 'Records video from input video or camera')
        self.define('pbLoad', '', 'path to .pb protobuf file (metaLoad must also be specified)')
        self.define('metaLoad', '', 'path to .meta file generated during --savepb that corresponds to .pb file')

    def define(self, argName, default, description):
        self[argName] = default
        self._descriptions[argName] = description