alternatively but slower and less performant is to just use interfaces completely, ie to bind to an event you just send an object (target) via interface to the event owner which adds it to an array. then when you call the event you loop over the array and call an event via interface on all ‘listening’ objects.
three advantages to this is you can get a list of all ‘listening’ objects for debugging, you can return values too although im not sure how useful this is yet and finally you know when the loop has completed if order matters for something