I'm trying to implement the Chain of Responsibility design pattern in Rust:
pub trait Policeman<'a> {
    fn set_next(&'a mut self, next: &'a Policeman<'a>);
}
pub struct Officer<'a> {
    deduction: u8,
    next: Option<&'a Policeman<'a>>,
}
impl<'a> Officer<'a> {
    pub fn new(deduction: u8) -> Officer<'a> {
        Officer {deduction, next: None}
    }
}
impl<'a> Policeman<'a> for Officer<'a> {
    fn set_next(&'a mut self, next: &'a Policeman<'a>) {
        self.next = Some(next);
    }
}
fn main() {
    let vincent = Officer::new(8);    // -+ vincent enters the scope
    let mut john = Officer::new(5);   // -+ john enters the scope
    let mut martin = Officer::new(3); // -+ martin enters the scope
                                      //  |
    john.set_next(&vincent);          //  |
    martin.set_next(&john);           //  |
}                                     // martin, john, vincent out of scope
This produces the error message:
error[E0597]: `john` does not live long enough
  --> src\main.rs:29:1
   |
27 |     john.set_next(&vincent);
   |     ---- borrow occurs here
28 |     martin.set_next(&john);
29 | }
   | ^ `john` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created
error[E0597]: `martin` does not live long enough
  --> src\main.rs:29:1
   |
28 |     martin.set_next(&john);
   |     ------ borrow occurs here
29 | }
   | ^ `martin` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created
error[E0597]: `john` does not live long enough
  --> src\main.rs:29:1
   |
28 |     martin.set_next(&john);
   |                      ---- borrow occurs here
29 | }
   | ^ `john` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created
Why does john not live long enough?  
- Created 
vincent - Created 
john - Created 
martin johnrefers tovincent(vincentin scope)martinrefers tojohn (johnin scope)martinout of scope (johnstill in scope)johnout of scope (vincentstill in scope)vincentout of scope
How do I need to change the lifetimes or the code to correctly implement the Chain of Responsibility pattern in Rust?