in reply to TIoCC :: DRYing the code

Having class initialization in the constructor bothers me. Also, there isn't a class_component_default_plugins accesssor constructed by the existing code. Presumably that's not a bug, but even if it is, there certainly exists the possibility that a C::C subclass might make _class_component_* attributes for which there should be no accessor (or only a customized one), and C::C itself has no way of knowing that.

If you really want to unDRY, I'd suggest going the other way: having the explicit list in @class_component up top and sub new use that (perhaps with $default_foo becoming $default{foo}).