As far as I can see from the source code (and I have not implemented one, so this is just out of curiosity), a plugin is just a class extending net.pms.external.ExternalListener that gets loaded and shutdown by the PMS bootstrap code.
It has to have a default constructor, but that is the only implementation constraint.
The current built-in extension points are:
[*]net.pms.external.StartStopListener, which gets informed of starting and stopping DLNA resources.[/*]
[*]net.pms.external.AdditionalResourceFolderListener, which gets informed each time a new virtual folder is created (?)[/*]
If your plugin needs to be notified of a different event, that will require modification of existing PMS code to generate the notifications.
For further details, I would suggest you reverse-engineer some of the existing plugins and see how they do their stuff.
Best of luck.