human
Write me a the Python program you requested given the following:
Complete the below
def decorator(caller):

    ''''General purpose decorator factory: takes a caller function as
    input and returns a decorator with the same attributes.
    A caller function is any function like this::
    def caller(func, *args, **kw):
    # do something
    return func(*args, **kw)
    Here is an example of usage:
    >>> @decorator
    ... def chatty(f, *args, **kw):
    ...     print("Calling %r" % f.__name__)
    ...     return f(*args, **kw)
    >>> chatty.__name__
    \'chatty\'
    >>> @chatty
    ... def f(): pass
    >>> f()
    Calling \'f\'
    decorator can also take in input a class with a .caller method.
in this
    case it converts the class into a factory of callable decorator objects.
    See the documentation for an example.'
    '''
assistant
#Here is the Python program you requested.
    if inspect.isclass(caller):
        return decorator_factory(caller)
    def _decorator(func):
        infodict = getinfo(func)
        argnames = infodict['argnames']
        assert (not (('_call_' in argnames) or ('_func_' in argnames))), 'You    cannot    use    _call_    or    _func_    as    argument    names!'
        src = ('lambda    %(signature)s:    _call_(_func_,    %(signature)s)' % infodict)
        dec_func = eval(src, dict(_func_=func, _call_=caller))
        return update_wrapper(dec_func, func, infodict)
    return update_wrapper(_decorator, caller)