On Wed, Jun 16, 2010 at 03:02:23PM -0700, Kate Yoak wrote:
> When I define my packages right inside a script (like for testing), Moose 
> inheritance breaks down:
> 
> #!/usr/bin/perl
> 
> use strict;
> use Test::More tests => 2;
> 
> my $one = new Foo::Child;
> ok($one->can('foo'), "extends"); #fails
> 
> my $two = new Foo::App;
> ok($two->can('foo'), "isa"); #succeeds
> 
> package Foo;
> {
>    use Moose;
>    sub foo{}; 1;
> }
> {
>    package Foo::Child;
>    use Moose; extends qw/Foo/;
>    1;
> }
> {
>    package Foo::App;
>    use Moose;
>    use base qw/Foo/;
>    1;
> }
> 
> I posted a month or more ago about a similar behavior with Roles. Karen 
> suggested I check that I use braces properly to localize namespaces.  I 
> didn't have time to do that at the time, but did now, trying all the obvious 
> things.
> Moving packages into a separate file solves the problem. 
> 
> 
> :-) Didn't do it!

'extends' happens at runtime, so when your test stuff is running, the
'extends' call hasn't happened yet. 'use' and 'package' are compile
time, so those parts *are* set up before the test stuff starts running.
Either move the packages up before the tests, or wrap the packages in a
BEGIN block.

(Unrelated, but indirect method calls are evil! Stop that!)

-doy

Reply via email to