def take_snapshot(self, name, description, pause):
        """Saves the current execution state
        and all settings of the machine and creates differencing images
        for all normal (non-independent) media.
        See :py:class:`ISnapshot`  for an introduction to snapshots.
        
        This method can be called for a PoweredOff, Saved (see
        :py:func:`save_state` ), Running or
        Paused virtual machine. When the machine is PoweredOff, an
        offline snapshot is created. When the machine is Running a live
        snapshot is created, and an online snapshot is created when Paused.
        
        The taken snapshot is always based on the
        :py:func:`current_snapshot` current snapshot
        of the associated virtual machine and becomes a new current snapshot.
        
        
        This method implicitly calls :py:func:`save_settings`  to
        save all current machine settings before taking an offline snapshot.

        in name of type str
            Short name for the snapshot.

        in description of type str
            Optional description of the snapshot.

        in pause of type bool
            Whether the VM should be paused while taking the snapshot. Only
            relevant when the VM is running, and distinguishes between online
            (@c true) and live (@c false) snapshots. When the VM is not running
            the result is always an offline snapshot.

        out id_p of type str
            UUID of the snapshot which will be created. Useful for follow-up
            operations after the snapshot has been created.

        return progress of type :class:`IProgress`
            Progress object to track the operation completion.

        raises :class:`VBoxErrorInvalidVmState`
            Virtual machine currently changing state.
        
        """
        if not isinstance(name, basestring):
            raise TypeError("name can only be an instance of type basestring")
        if not isinstance(description, basestring):
            raise TypeError("description can only be an instance of type basestring")
        if not isinstance(pause, bool):
            raise TypeError("pause can only be an instance of type bool")
        (progress, id_p) = self._call("takeSnapshot",
                     in_p=[name, description, pause])
        progress = IProgress(progress)
        return (progress, id_p)