You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: toolbar.rs
    path of file: ./repos/cacao/examples/browser
    
    the code of the file until where you have to start completion: use cacao::objc::{msg_send, sel};

use cacao::button::Button;
use cacao::input::{TextField, TextFieldDelegate};

use cacao::appkit::toolbar::{ItemIdentifier, Toolbar, ToolbarDelegate, ToolbarDisplayMode, ToolbarItem};

use super::Action;

const BACK_BUTTON: &str = "BackButton";
const FWDS_BUTTON: &str = "FwdsButton";
const URL_BAR: &str = "URLBar";

#[derive(Debug)]
pub struct URLBar;

impl TextFieldDelegate for URLBar {
    const NAME: &'static str = "URLBar";

    fn text_did_end_editing(&self, value: &str) {
        Action::Load(value.to_string()).dispatch();
    }
}

#[derive(Debug)]
pub struct BrowserToolbar {
    back_item: ToolbarItem,
    forwards_item: ToolbarItem,
    url_bar: TextField<URLBar>,
    url_bar_item: ToolbarItem
}

impl BrowserToolbar {
    pub fn new() -> Self {
        let back_button = Button::new("Back")
    
    pub fn new() -> Self {
        let back_button = Button::new("Back");
        let mut back_item = ToolbarItem::new(BACK_BUTTON);
        back_item.set_button(back_button);
        back_item.set_action(|_| Action::Back.dispatch());

        let forwards_button = Button::new("Forwards");
        let mut forwards_item = ToolbarItem::new(FWDS_BUTTON);
        forwards_item.set_button(forwards_button);
        forwards_item.set_action(|_| Action::Forwards.dispatch());

        let url_bar = TextField::with(URLBar);
        let url_bar_item = ToolbarItem::new(URL_BAR);

        // We cheat for now to link these, as there's no API for Toolbar yet
        // to support arbitrary view types. The framework is designed to support this kind of
        // cheating, though: it's not outlandish to need to just manage things yourself when it
        // comes to Objective-C/AppKit sometimes.
        //
        // As long as we keep hold of things here and they all drop together, it's relatively safe.
        url_bar.objc.with_mut(|obj| unsafe {
            let _: () = msg_send![&*url_bar_item.objc, setView:&*obj];
        });

        BrowserToolbar {
            back_item,
            forwards_item,
            url_bar,
            url_bar_item
        }
    }