Fixes #6560 - Extract puppet parsing logic

Runtime check doesn't have to be slow -- can be done during initialization, something like check a list of expected methods against a list of public methods. Set operations are fast.

I wouldn't write an explicit test for every subclass, as that puts the burden on the writer of the plugin, which kinda defeats the purpose. It's trivial to get a list of subclasses of a class from ObjectSpace, and the do the test similar to the one I suggested above.

Re: LSP: you don't know at runtime (without checks above) if a class implemented all required methods, which means that depending on the concrete implementation a particular call may result in an exception.