in Elixir, it is possible to have multiple modules in one file, as well as nested modules

macros are chunks of code that are executed and expanded at compilation time

this means, in order to use a macro, we need to guarantee its module and implementation are available during compilation. this is done with the 'require' directive

in general a module does not need to be required before usage, except if we want to use the macros available in that module. an attempt to call a macro that was not loaded will raise an error