¿Cómo llamar a un método que se consume en un objeto de rasgo en caja?

Tengo el siguiente boceto de una implementación:

trait Listener {
    fn some_action(&mut self);
    fn commit(self);
}

struct FooListener {}

impl Listener for FooListener {
    fn some_action(&mut self) {
        println!("{:?}", "Action!!");
    }

    fn commit(self) {
        println!("{:?}", "Commit");
    }
}

struct Transaction {
    listeners: Vec<Box<Listener>>,
}

impl Transaction {
    fn commit(self) {
        // How would I consume the listeners and call commit() on each of them?
    }
}

fn listener() {
    let transaction = Transaction {
        listeners: vec![Box::new(FooListener {})],
    };
    transaction.commit();
}

yo puedo tenerTransactions con oyentes que llamarán al oyente cuando ocurra algo en esa transacción. Ya queListener&nbsp;es un rasgo, guardo unVec<Box<Listener>>.

Estoy teniendo dificultades para implementarcommit&nbsp;paraTransaction. De alguna manera tengo que consumir las cajas llamandocommit&nbsp;en cada uno de los almacenadosListeners, pero no puedo mover cosas de una caja por lo que sé.

¿Cómo consumiría a mis oyentes en commit?