# V3 Initializers
## Module Implementators TLDR
Initializable modules should:
* Inherit `InitializableMixin` (see below)
* Override the internal function `_isInitialized()`
* Implement an external/public view called is***ModuleName***Initialized() that returns a bool
* Implement an external/public called initialize***ModuleName***(...)
i.e.
```solidity=
contract SampleModule is InitializableMixin {
...
function initializeSampleModule(address param1, address param2, uint param3) external onlyIfNotInitialized {
// Will reverti if called after initialization
// ...
// Set initialized. This can be logically derived from other params and not in a specific boolean. Showed as boolean to simplify the example
_someStorage().initialized = true;
}
function isSampleModuleInitialized() external returns(bool) {
return _isInitialized();
}
function _isInitialized() internal override returns(bool) {
// isInitialized logic. This can be logically derived from other params and not in a specific boolean. Showed as boolean to simplify the example
return(_someStorage().initialized);
}
...
function someFuntion() external onlyIfInitialized {
// will revert unless the module was initialized
}
...
}
```
## InitializableMixin
InitializebleMixin adds two modifiers (`onlyIfInitialized` and `onlyIfNotInitialized`) and requires the implementation of the virtual function (`_isInitialized()`)
```solidity=
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../errors/InitError.sol";
abstract contract InitializableMixin {
modifier onlyIfInitialized() {
if (!_isInitialized()) {
revert InitError.NotInitialized();
}
_;
}
modifier onlyIfNotInitialized() {
if (_isInitialized()) {
revert InitError.AlreadyInitialized();
}
_;
}
function _isInitialized() internal virtual view returns(bool);
}
```
## Tooling
### Deployer
The tooling will check if a module inherits the `InitializableMixin`. If a module inherits the mixin it should:
- Check if there's an external function named is***ModuleName***Initialized() that returns a bool
- Check if there's an external function named initialize***ModuleName***() (with or without parameters)
### CLI
The CLI will raise a warning when trying to interact with a initializable module that wasn't initialized.