'''
with_... docs:

@task
def setup_new_system():
    add_user() # executed as root
    update_environ_of_user() # executed as user
'''


def with_user():
    '''
    Uses our custom system object: env.system.user

    @task
    @with_user()
    def update_environ_of_user():
        ....

    '''
    def outer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            with settings(user=env.system.user):
                return func(*args, **kwargs)
        return _wrap_as_new(func, inner)
    return outer

def with_root():
    '''
    @task
    @with_root()
    def add_user():
        ...
    '''
    def outer(func):
        @wraps(func)
        def inner(*args, **kwargs):
            with settings(user='root'):
                return func(*args, **kwargs)
        return _wrap_as_new(func, inner)
    return outer
