Bug / feature / idiot user?

[email protected] (Andy Armstrong)
Newsgroups perl.moose
Message-ID <[email protected]>
I've finally buckled to peer pressure and adopted Moose. So far I / 
really/ like it. Thanks.

I'm having a problem that may well just be me doing something silly.  
Given the following:

     $ cat Configurable.pm
     package Configurable;

     use Moose::Role;
     use Configuration;

     has 'config' => (
       handles  => ['option'],
       default  => sub { Configuration->new },
     );

     #sub option { 'fake' }

     1;

     $ cat Configuration.pm
     package Configuration;

     use Moose;

     sub option { 'option value' }

     1;

     $ cat Loggable.pm
     package Loggable;

     use Moose::Role;

     requires 'option';

     sub log { print 'Option is ', shift->option, "\n" }

     1;

     $ cat Thing.pm
     package Thing;

     use Moose;

     with 'Configurable', 'Loggable';

     sub run { shift->log }

     1;

I get this:

     $ perl -MThing -e 'Thing->new->run'
     'Configurable|Loggable' requires the method 'option' to be  
implemented by 'Thing' at /alt/local/lib/perl5/site_perl/5.10.0/Moose/ 
Meta/Role/Application.pm line 59
      
Moose 
::Meta 
::Role 
::Application 
::apply('Moose::Meta::Role::Application::ToClass=HASH(0x854b5f8)',  
'Moose::Meta::Role::Composite=HASH(0x84be570)',  
'Moose::Meta::Class=HASH(0x84b8dc0)') called at /alt/local/lib/perl5/ 
site_perl/5.10.0/Moose/Meta/Role/Application/ToClass.pm line 17
      
Moose 
::Meta 
::Role 
::Application 
::ToClass 
::apply('Moose::Meta::Role::Application::ToClass=HASH(0x854b5f8)',  
'Moose::Meta::Role::Composite=HASH(0x84be570)',  
'Moose::Meta::Class=HASH(0x84b8dc0)') called at /alt/local/lib/perl5/ 
site_perl/5.10.0/Moose/Meta/Role.pm line 447
      
Moose 
::Meta::Role::apply('Moose::Meta::Role::Composite=HASH(0x84be570)',  
'Moose::Meta::Class=HASH(0x84b8dc0)') called at /alt/local/lib/perl5/ 
site_perl/5.10.0/Moose/Util.pm line 96
      
Moose::Util::apply_all_roles('Moose::Meta::Class=HASH(0x84b8dc0)',  
'Configurable', 'Loggable') called at /alt/local/lib/perl5/site_perl/ 
5.10.0/Moose.pm line 70
     Moose::with('Thing', 'Configurable', 'Loggable') called at /alt/ 
local/lib/perl5/site_perl/5.10.0/Moose/Exporter.pm line 192
     Moose::with('Configurable', 'Loggable') called at Thing.pm line 5
     require Thing.pm called at -e line 0
     main::BEGIN() called at Thing.pm line 0
     eval {...} called at Thing.pm line 0
     Compilation failed in require.
     BEGIN failed--compilation aborted.

If I uncomment the implementation of C<option> in Configurable.pm it  
works
just fine - and delegates correctly to the C<option> in  
Configuration.pm.

If I comment out the 'requires' in Loggable it also works fine.

So I guess the combination of delegation and role composition puts the
implementation of C<option> out of reach to requires?

Am I doing something silly?

-- 
Andy Armstrong, Hexten
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.