A more general approach to providing protected methods may be implemented using
Class::AutoloadCAN. Which I never really completed. (But to be fair, I don't know if anyone is actually interested in using it.) See
RFC: Class::AutoloadCAN for my ideas on how to complete that implementation.
That module was meant to be my answer to the problems I raised in Why breaking can() is acceptable, and hence was more proof of concept than anything else. But it can be made to work.