Custom Modules
You may already be familiar with THT's built-in modules, like Math and Input.
You can create your own modules, which let you organize your functions and make them accessible from any page (or another module) in your app.
Defining a Module
To define a module, create a .tht file in the code/modules folder.
Module names are always UpperCamelCase.
code/modules/MyModule.tht code/modules/blog/BlogPost.tht
Module Functions
Functions must be declared public so they can be called outside of the module.
// modules/MyModule.tht
//--------------------------------------
public fun sayHello($name) {
print('Hello, ' ~ $name ~ '!')
}
To call a module function, use dot . notation.
// pages/myPage.tht
//--------------------------------------
MyModule.sayHello('Tez')
//= 'Hello, Tez!'
Loading Modules
Auto-Loading
If the module is in the top-level modules directory, it will be automatically loaded when one of its methods is called.
MyModule.hello() // modules/MyModule.tht
Manual Loading
Use the load function to manually import a module into the current file.
This is required if the module is under a subdirectory.
// pages/blog.tht
//---------------------------------
load('blog/Article') // modules/blog/Article.tht
Article.addToViewCount()
Relative Paths
Modules can load other modules using relative paths (. and ..).
// modules/blog/Article.tht
//---------------------------------
load('./Comment') // modules/blog/Comment.tht
Loading Multiple Modules
You can use a wildcard * to load all modules in a given directory.
load('subdir/*')
It returns a map of the loaded modules that can be used directly.
For example:
$modules = load('colors/*')
foreach $modules as $modName/$mod {
print($modName ~ ': ' ~ $mod.getRgb())
}
// RedColor: #ff0000
// GreenColor: #00ff00
// BlueColor: #0000ff
Module Fields
You can assign data fields to a module using the @@ (“this module”) symbol.
These fields can be accessed anywhere within the current module.
// modules/MyApp.tht
//--------------------------------------
@@.numUsersCreated = 0
fun newUser {
...
@@.numUsersCreated += 1
}
Module Constants
Any module field that begins with a capital letter is a read-only constant.
@@.ContactEmail = 'hello@example.com'
@@.MaxPostsPerDay = 5
@@.Color = {
Red
Blue
Green
}
Outside Access
Module constants can be accessed outside the module.
// pages/home.tht //-------------------------------------- $contact = 'My email is: ' ~ MyApp.ContactEmail