# Interface for communication between modules
- Having a parent Publisher and subscriber class will not provide enough rigidity to the current code structure.
- **Use Enums to define events**
- Each module should have an Enum: <ModuleName>EventEnum
- For example for `BayManager` - `BayManagerEventsEnum` or `bay_manager_events`
- This enum will contain all the events that can occur in this module.
```python
from enum import Enum
class BayManagerEventsEnum(Enum):
READY_DISK=1
DISK_STATUS=2
PHYSICALLY_DISCONNECTED=3
REMOVED_DRIVES=4
class Publisher:
...
def __init__(EventsEnum):
subscribers = {event: dict() for event in EventsEnum}
def get_subscribers(self, event):
return self.events[event]
def register(self, event, subscriber, callback):
if event in BayManagerEventsEnum:
self.get_subscribers(event)[subsriber] = callback
def unregister(self, event, subscriber):
del self.get_subscribers(event)[subscriber]
def notify(self, event, message):
for subscriber, callback in self.get_subscribers(event).items():
callback(message)
class BayManager(Publihser):
def __init__():
super.__init__(BayManagerEventsEnum)
```
- **Having events defined by Enums, use a dictionary to register and notify**
- The subscribers can subscribe to any event in a module
```python
# Example of how API provider can subscribe to an event
import BayManagerEventsEnum
class API:
def __init__(_bayManager):
self._bayManager = _bayManager
self._bayManager.register(BayManagerEventsEnum.READY_DISK, self, self.ready_events_callback)
def ready_events_callback(message=None):
self._ready_disks()
```
A better way to register subscribers would be during object creation rather than during starting the modules. This can prevent many bugs, for example:-
- Suppose we create object of BayManager and start it before passing it to API class constructor.
- If a drivebay is already inserted when the readout_station.service is started, it is a possibility that BayManager can detect and store the inserted drivebay before API can register itself.
- It can cause API to miss the data of inserted drivebay, and it will show empty on the UI even though the drivebay is inserted.