Decorator example

pub struct TopObject {
    object: MiddleObject,
}

pub struct MiddleObject {
    object: BottomObject,
}

pub struct BottomObject;

pub struct Info<'a, 'b>
    where 'b: 'a
{
    info: Option<&'a mut Info<'a, 'b>>,
}

pub trait Do {
    fn process<'a, 'b>(&mut self, info: &'a mut Info<'a, 'b>)
    where 'b: 'a;
}

impl Do for TopObject {
    fn process<'a, 'b>(&mut self, info: &'a mut Info<'a, 'b>)
        where 'b: 'a
    {
        let mut info: Info<'a, 'b> = Info { info: Some(info) };
        self.object.process(&mut info);
    }
}

impl Do for MiddleObject {
    fn process<'a, 'b>(&mut self, info: &'a mut Info<'a, 'b>)
        where 'b: 'a
    {
        let mut info = Info { info: Some(info) };
        self.object.process(&mut info);
    }
}

impl Do for BottomObject {
    fn process<'a, 'b>(&mut self, info: &'a mut Info<'a, 'b>)
        where 'b: 'a
    {
        println!("HI");
    }
}

fn main() {
    let mut top_object = TopObject { object: MiddleObject { object: BottomObject } };
    top_object.process(&mut Info { info: None });
}

Is it possible? What should I change?