I'm with Chris, this is more of a design issue. What is the common part between A and B that could not be pulled out to a role?
On 7/2/08, Chris Prather <[EMAIL PROTECTED]> wrote: > On Wed, 2 Jul 2008 17:22:44 -0700, Christopher Brown wrote: > > Hi All, > > > > What is the best way to moosify an existing CPAN class and all the classes > > called by this class. I know that *extends* works: > > > > package MooseX::Module::A; > > use Moose; > > extends 'Module::A'; > > > > > > package MooseX::Module::B; > > use Moose; > > extends 'Module::B'; > > > > sub my_b_extension { > > ... > > } > > > > > > But how do you extend both modules when Module::A relies on and calls > > Module::B? Such as. > > > > package Module::A;. > > > > sub create_b { > > my $self = shift; > > $self->{b} = Module::B->new(); > > } > > > > ... > > > > Now in: > > > > package main; > > use MooseX::Module::A; > > use MooseX::Module::B; > > > > my $a = Moose::X::Module::A->new(); # Cool > > $a->create_b; # Cool > > $a->{b}->my_b_extension(); # FAIL! > > > > In this scenario, I will not see *my_b_extension*. In normal, non-Moose > > Perl, I would: > > > > package Module::AX; > > use *base* 'Module::A'; > > ... > > > > package Module::BX; > > use *base* 'Module::B'; > > ... > > > > > Well base.pm and moose play fairly nice together ... but I'm not sure > even base.pm would solve this ... > > $self->{b} = Module::B->new(); # you hardcode the module name here ... > nothing can save you now > > you'd need to override the create_b method in MX::Module::A ... which > you'd have to do in any perl code because you've hardcoded the > classname in the method. This isn't a Moose problem, this is a crappy > design decision problem. > > If you want to be able to subclass Module::B ... then create_b either > needs to make the classname for B configurable (via a parameter to the > method, or an attribute in A or something...) or you need to override > it in your subclass of A to call the class you need ... (or you > override it with something configurable). > > > -Chris > -- benh~