/// <summary>
        /// This is the method that builds all of the compnents, layouts and regions
        /// that make up the menu package
        /// </summary>
        public override IPackage Build(IFluentBuilder builder)
        {
            /******************************************************************
            *
            * These things are shared between the desktop and mobile menus
            *
            ******************************************************************/

            // This component outputs CSS that makes the menu work as a menu
            builder.BuildUpComponent(new MenuStyles())
            .Name("menuStyles")
            .Build();

            // This component outputs CSS that defines the menu appearence
            builder.BuildUpComponent(new MenuStyle1())
            .Name("menuStyle1")
            .NeedsComponent("menuStyles")
            .Build();

            // This component displays a main menu item
            var mainMenuItemComponent = builder.BuildUpComponent(
                new MenuItemComponent(Dependencies.ComponentDependenciesFactory))
                                        .BindTo <MenuItem>()
                                        .Build();

            // This component displays a submenu item
            var subMenuItemComponent = builder.BuildUpComponent(
                new MenuItemComponent(Dependencies.ComponentDependenciesFactory))
                                       .BindTo <MenuItem>("submenu")
                                       .Build();

            // This data provider extracts sub-menu items from the current menu item
            // using fluent syntax.
            var subMenuDataProvider = builder.BuildUpDataProvider()
                                      .BindTo <MenuItem>()
                                      .Provides <IList <MenuItem> >((rc, dc, d) =>
            {
                var menuItem = dc.Get <MenuItem>();
                dc.Set <IList <MenuItem> >(menuItem.SubMenu, "submenu");
            },
                                                                    "submenu")
                                      .Build();

            /******************************************************************
            *
            * These things are for the desktop menu only
            *
            ******************************************************************/

            // This region is a container for the options on the desktop menu
            var desktopMenuItemRegion = builder.BuildUpRegion()
                                        .BindTo <MenuItem>()
                                        .Tag("div")
                                        .Component(mainMenuItemComponent)
                                        .Build();

            // This region is a container for the desktop drop down menu items. It
            // renders one menu item component for each menu item in the sub-menu
            var desktopDropDownMenuRegion = builder.BuildUpRegion()
                                            .Tag("div")
                                            .ClassNames("{ns}_dt_dropdown")
                                            .ForEach <MenuItem>("submenu", null, null, "submenu")
                                            .Component(subMenuItemComponent)
                                            .Build();

            // This layout defines the desktop menu option and the sub-menu that
            // drops down when the main menu option is tapped or hovered
            var desktopOptionLayout = builder.BuildUpLayout()
                                      .Tag("li")
                                      .ClassNames("{ns}_dt_option")
                                      .ZoneNesting("head,submenu")
                                      .Region("head", desktopMenuItemRegion)
                                      .Region("submenu", desktopDropDownMenuRegion)
                                      .DataProvider(subMenuDataProvider)
                                      .Build();

            // This region is the whole desktop menu structure with top level menu
            // options and sub-menus beneath each option. This is the region you
            // need to add to a layout in your page to display a desktop menu.
            builder.BuildUpRegion()
            .Name("desktop_menu")
            .Tag("ul")
            .NeedsComponent("menuStyles")
            .ClassNames("{ns}_dt_menu")
            .ForEach <MenuItem>("", "", "", "desktop")
            .Layout(desktopOptionLayout)
            .Build();

            /******************************************************************
            *
            * These things are for the mobile menu only
            *
            ******************************************************************/

            // This component displays the hamburger button
            var mobileHamburgerButtonComponent = builder.BuildUpComponent(
                new HamburgerButtonComponent(Dependencies.ComponentDependenciesFactory))
                                                 .Build();

            // This component displays a main menu item
            var mobileHeaderComponent = builder.BuildUpComponent(
                new MobileHeaderComponent(Dependencies.ComponentDependenciesFactory))
                                        .BindTo <MenuItem>()
                                        .Build();

            // This region contains a top-level option on the mobile menu
            var mobileMenuHead = builder.BuildUpRegion()
                                 .Tag("")
                                 .Component(mobileHeaderComponent)
                                 .Build();

            // This region repeats for each sub-menu option on a mobile menu
            var mobileSubMenu = builder.BuildUpRegion()
                                .Tag("")
                                .Component(subMenuItemComponent)
                                .ForEach <MenuItem>("submenu", "li", null, "submenu", "{ns}_mb_option")
                                .Build();

            // This layout defines mobile menus as having a head followed by a list
            // of the sub-menu options
            var mobileMenuOptionLayout = builder.BuildUpLayout()
                                         .Tag("")
                                         .ZoneNesting("head,subMenu")
                                         .Region("head", mobileMenuHead)
                                         .Region("subMenu", mobileSubMenu)
                                         .DataProvider(subMenuDataProvider)
                                         .Build();

            // This region contains the hamburger button
            var mobileHamburgerRegion = builder.BuildUpRegion()
                                        .Tag("")
                                        .Component(mobileHamburgerButtonComponent)
                                        .Build();

            // This region contains the panel that slides out from the edge of the page
            var mobileSlideoutRegion = builder.BuildUpRegion()
                                       .Tag("ul")
                                       .ClassNames("{ns}_mb_slideout")
                                       .ForEach <MenuItem>("", "", "", "mobile")
                                       .Layout(mobileMenuOptionLayout)
                                       .Build();

            // This layout is the top-level container for the mobile menu. It defines
            // the mobile menu consisting of a hamburger button and a slide-out panel
            var mobileMenuLayout = builder.BuildUpLayout()
                                   .ZoneNesting("hamburger,slideout")
                                   .Region("hamburger", mobileHamburgerRegion)
                                   .Region("slideout", mobileSlideoutRegion)
                                   .Build();

            // This region is the whole mobile menu structure with a hamburger
            // button that opens and closes a slide-out sidebar menu. This is
            // the region you would add to your website to include a mobile menu
            builder.BuildUpRegion()
            .Name("mobile_menu")
            .NeedsComponent("menuStyles")
            .ClassNames("{ns}_mb_menu")
            .Layout(mobileMenuLayout)
            .Build();

            return(this);
        }