class vm:

    def power_on(self):
        return "vm is powered on"

    def exec_cmd(self, cmd):
        return "%s executed on vm" % cmd

    def revert_snapshot(self, name):
        return "reverting to snapshot %s" % name

    def task(self, *args):
        return "something goes wrong"

    def three(self, arg1, arg2, arg3, argn):
        return arg1,arg2,arg3,argn

class manager:
    def open_vm(self):
        self.vm = vm()
    
    def __getattr__(self, name):
        f = getattr(vm, name)
        return f

    def revert_last_snapshot(self):
        return self.revert_snapshot("last")

    def _run_task(self, vm, func, args, task=False):
        f = getattr(vm, func)
        if task is True:
            task = f(args)
            return "task: %s" % task
        else:
            return f(args)

    def revert_new_snaphost(self, vm, snapshot):
        return self._run_task(vm, "revert_snapshot", snaphost, task=True)

    def exec_cmd(self, vm, cmd, args):
        return self._run_task(vm, "exec_cmd", cmd, args)

class man:

    def _run_cmd(self, vm, func, params=None, task=False):
        f = getattr(vm, func)

        if task is True:
            if params is None:
                task = f
            else:
                task = f(params)
            return task
        else:
            if params is None:
                return f
            else:
                return f(params)

    def power_on(self, vm):
        return self._run_cmd(vm,"power_on", task=True)

    def execute(self, vm, cmd, args=[]):
        return self._run_cmd(vm, "exec_cmd", [cmd, args])




if __name__ == "__main__":

    vm = vm()

    m = manager()
    print m.revert_last_snapshot()
    print m.exec_cmd(vm,"yoo","gigs")

    n = man()
    print n.power_on(vm)
    print n.execute(vm, "cmd",["arg1","arg2"])


