You will need to introduce a `self.module_footer` as an `EasyBlock` class variable, and then pass down the value of `options.modules_footer` when you're creating the `EasyBlock` instance (possibly in multiple locations)...

So, you end up with something like this in the `EasyBlock` `__init__` constructor:

```python
self.modules_footer = None
if modules_footer_path is not None:
    self.modules_footer = read_file(modules_footer_path)
```

Here (in `make_module_footer`), you would then need to check for something like:

```python
if self.modules_footer is not None:
    txt += self.modules_footer
```

i.e., `self.modules_footer` should contain the actual text, not the file path that contains the footer text, the `read_file` call will move to the `__init__` constructor of `EasyBlock`. By reading the file early, when instantiating the `EasyBlock` instance, you will also fail early in case the file is not around.

We also need to enhance the unit tests, basically add a test that hits the `make_module_footer` function and specifies a footer to be used (and then checks whether the footer text is actually included in the generated module).

The `toy_build` unit test is probably a good location for this.

This is actually a poor mans version of site customization, in the sense that it applies always, not depending on the details of the build being performed. It does make sense to have it though, next to proper fine-grained site customization support.