--- layout: page title: Menu Modules --- ## Menu Modules All menu entries found within `menu.hjson` are backed by *menu modules*. Menus are any screen or sectionin within the system. A main menu, a door launcher, and MRC chat are all examples of menus. For basic menus, a standard handler is implemented requiring no code. However, if you would like to create a menu that has custom handling, simply inherit from `MenuModule`. More on this below. > :information_source: Remember that ENiGMA does not impose any stucture to your system! The "flow" of all `menu.hjson` entries is up to you! ## Creating a New Module At the highest level, to create a new custom menu or mod, inherit from `MenuModule` and expose it via the `getModule` exported method: ```javascript // my_fancy_module.js exports.getModule = class MyFancyModule extends MenuModule { constructor(options) { super(options); } }; ``` ## Lifecycle Below is a very high level diagram showing the basic lifecycle of a menu. ![Basic Menu Lifecycle](../../assets/images/basic_menu_lifecycle.png) Methods indicated above with `()` in their name such as `enter()` are overridable when inheriting form `MenuModule`. ## MenuModule Helper Methods Many helper methods exist and are available to code inheriting from `MenuModule`. Below are some examples. Poke around at [menu_module.js](../../../core/menu_module.js) to discover more! * `displayAsset()` * `prepViewController()` * `prepViewControllerWithArt()` * `promptForInput()` * `displayArtAndPrepViewController()` * `setViewText()` * `getView()` * `updateCustomViewTextsWithFilter()` * `refreshPredefinedMciViewsByCode()` * `validateMCIByViewIds()` * `validateConfigFields()` * `getDateFormat()` * `getTimeFormat()` * `getDateTimeFormat()` > :information_source: Search the code for the above methods to see how they are used in the base system!