def METHOD_NAME(self, functions_orig, groups_orig, classes_orig, rows_f, parsed_args):
    functions = copy.deepcopy(functions_orig)
    groups = copy.deepcopy(groups_orig)
    classes = copy.deepcopy(classes_orig)
    feature_rows = []
    run_methods = []
    def verify_feature_row(method, feature_row):
        assert isinstance(feature_row, list), 'method %s returned non list: %s' % (
            method, feature_row)
        non_dicts = {x for x in feature_row if not isinstance(x, dict)}
        assert not non_dicts, 'method %s returned something not a dict: %s' % (
            method, non_dicts)
    def run_func(method, func, descr):
        print(f'running {descr}...', end='')
        start_time = time.time()
        feature_row = func()
        elapsed_time = int(time.time() - start_time)
        print(f'{elapsed_time}s')
        verify_feature_row(method, feature_row)
        return feature_row
    # attempt to group methods together based on same field name for more cache hits.
    def method_key(method):
        return ''.join(reversed(method.strip('_in').strip('_out')))
    for f in classes:
        if groups:
            methods = filter(
                lambda funcname: funcname.startswith(groups), dir(f[0]))
            for method in sorted(methods, key=method_key):
                feature_rows.append(run_func(method, lambda: f[0].run_func(
                    method, rows_f, parsed_args), f'{f[1]}/{method}'))
                run_methods.append((f[1], method))
    # run remaining extras
    for function in functions:
        if function not in run_methods:
            for f in classes:
                if f[1] == function[0]:
                    method = function[1]
                    feature_rows.append(run_func(method, lambda: f[0].run_func(
                        method, rows_f, parsed_args), f'{f[1]}/{function[1]}'))
    return feature_rows