Hi Aristos Queue,
First of all, thank you for posting your solution. At last we can see some simple examples of LVOOP.
There are two things I would have done differently, one major the other minor:
1. The (action wrapper VI) would be a method of the "ATM.lvclass".
The "ATM Massage.lvclass" would only be used for transfering the massage, not for doing the action. The massage would contain typedef enum named "Action" as private data. see here.
Inside the case structure I would put dynamic dispatch VIs for handling the actions, so ATMs that will inherit from a more generic ATM would override these actions if needed. The massages will remain the same for all ATMs.
So, my point here is: The action should done by the ATM not by the Massage.
2. I would make the massage event data type a typedef enum. It will be more strict and readable then free text.
Regards,
Amir Y.