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}).