def start(self, **kwargs):
        ts = {}
        ret = {}
        info_parts = {'info', 'get-value', 'get_value'}
        for cmd in self.commands:
            parser_cmd = self.parser_commands.get(cmd, cmd)
            if parser_cmd in kwargs or cmd in kwargs:
                kws = kwargs.get(cmd, kwargs.get(parser_cmd))
                if isinstance(kws, Namespace):
                    kws = vars(kws)
                func = getattr(self, cmd or 'main')
                ret[cmd] = func(**kws)
                if cmd not in info_parts:
                    ts[cmd] = str(dt.datetime.now())
        exp = self._experiment
        project_parts = {'setup'}
        projectname = self._projectname
        if (projectname is not None and project_parts.intersection(ts) and
                projectname in self.config.projects):
            self.config.projects[projectname]['timestamps'].update(
                {key: ts[key] for key in project_parts.intersection(ts)})
        elif not ts:
            self.no_modification = True
        if exp is not None and exp in self.config.experiments:
            projectname = self.projectname
            try:
                ts.update(self.config.projects[projectname]['timestamps'])
            except KeyError:
                pass
            if not self.is_archived(exp):
                self.config.experiments[exp]['timestamps'].update(ts)
        return Namespace(**ret)