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~

Reply via email to