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

Reply via email to