<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_table( table_name, table, cache=False, cache_scope=_CS_FOREVER, copy_col=True):
 """ Register a table with Orca. Parameters table_name : str Should be globally unique to this table. table : pandas.DataFrame or function If a function, the function should return a DataFrame. The function's argument names and keyword argument values will be matched to registered variables when the function needs to be evaluated by Orca. cache : bool, optional Whether to cache the results of a provided callable. Does not apply if `table` is a DataFrame. cache_scope : {'step', 'iteration', 'forever'}, optional Scope for which to cache data. Default is to cache forever (or until manually cleared). 'iteration' caches data for each complete iteration of the pipeline, 'step' caches data for a single step of the pipeline. copy_col : bool, optional Whether to return copies when evaluating columns. Returns ------- wrapped : `DataFrameWrapper` or `TableFuncWrapper` """

    if isinstance(table, Callable):
        table = TableFuncWrapper(table_name, table, cache=cache,
                                 cache_scope=cache_scope, copy_col=copy_col)
    else:
        table = DataFrameWrapper(table_name, table, copy_col=copy_col)

    # clear any cached data from a previously registered table
    table.clear_cached()

    logger.debug('registering table {!r}'.format(table_name))
    _TABLES[table_name] = table

    return table