If you really need to some how pull each in to eachother then this was
the only way I could get things to work:

[My::A]
package My::A;
use Moose;
has b => (
   is => 'rw',
   isa => 'My::B',
   lazy =>1,
   default => sub{
      use My::B;
      My::B->new;
   }
);
sub kitten { return 'cute' };
1;

[My::B]
package My::B;
use Moose;
has a => (
   is => 'rw',
   isa => 'My::A',
   lazy => 1,
   default => sub{
      use My::A;
      My::A->new;
   }
);
sub hello {return 'world';}
1;

[AB.pl]
#!/usr/bin/perl
use strict;
use warnings;
use Test::More qw{no_plan};
use My::A;
my $a = My::A->new;
is( $a->b->hello, 'world'); #PASS
is( $a->b->a->kitten, 'cute'); #PASS




On 7/2/08, benh <[EMAIL PROTECTED]> wrote:
> 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~
>


-- 
benh~

Reply via email to