This really has nothing to do Moose per se, but it is a problem with MooseX::Declare. Back at 5.11.2 Zefram introduced changes into perl core that basically broke Devel::Declare modules. The work around is to use ugly K&R brace style. Yes the white space after method arguments/traits/etc and before the opening brace is significant until this is fixed. TL;DR: newlines after method declarations before the brace breaks MXD.
Hope this helps. Come join us on irc://irc.perl.org/#devel-declare and bug people there to get this fixed. -- Nicholas Perez XMPP/Email: [email protected] http://search.cpan.org/~nperez http://github.com/nperez ----- Original message ----- > Guys, > > Okay, this has been bugging us for a while now, because we've been > wanting to do some QA on Perl 5.12 with an eye to switching our > production environment to it at some point, but this error has stopped > us. But I've just now had the opportunity to whittle it down to > something small enough for you guys to chew on. Here's our example > file (a.k.a. borked.pm): > > { > package SomeRole; > use Moose::Role; > requires 'some_method'; > } > > > use MooseX::Declare; > > class SomeClass with SomeRole > { > > method some_method > { > } > #method foo {} > > } > > 1; > > This seems to be as small as I can possibly make it. Now, this > compiles just fine on perl 5.8.x, 5.10.x, and 5.12.x. However, the > problem becomes when we try to include it via Mason. Take this > simple/stupid template: > > <%perl> > print "Hello World!\n"; > </%perl> > <%init> > use borked; > </%init> > > This works fine on 5.8.x (where the larger code is in production even > as we speak), and I believe on 5.10.x as well (which we are using for > some of our dev sandboxes). But not on 5.12.x (I believe we've tried > 5.12.0, 5.12.1, and now 5.12.2). There, you get this error (here I'm > using masonsh from MasonX::Shell, but this happens on Apache restart > with normal Mason): > > Error during compilation of <anonymous component>: > 'SomeRole' requires the method 'some_method' to be implemented by > 'SomeClass' at /usr/local/lib/perl5/site_perl/5.12.2/i686-l > inux/Moose/Meta/Role/Application.pm line 77 > > Moose::Meta::Role::Application::apply('Moose::Meta::Role::Application::ToClass=HASH(0xa392ff8)', > 'Moose::Meta::Role=H ASH(0x9e47ff8)', > 'Moose::Meta::Class=HASH(0xa41c068)') called at > /usr/local/lib/perl5/site_perl/5.12.2/i686-linux/Moose/Meta/ > Role/Application/ToClass.pm line 31 > Moose::Meta::Role::Application::ToClass::apply('Moose::Meta::Role::Application::ToClass=HASH(0xa392ff8)', > 'Moose::Met a::Role=HASH(0x9e47ff8)', > 'Moose::Meta::Class=HASH(0xa41c068)', 'HASH(0xa46ba80)') called at > /usr/local/lib/perl5/site_perl/5 .12.2/i686-linux/Moose/Meta/Role.pm > line 416 > Moose::Meta::Role::apply('Moose::Meta::Role=HASH(0x9e47ff8)', > 'Moose::Meta::Class=HASH(0xa41c068)') called at > /usr/local/lib/perl5/site_perl/5.12.2/i686-linux/Moose/Util.pm line 133 > > Moose::Util::_apply_all_roles('Moose::Meta::Class=HASH(0xa41c068)', > undef, 'SomeRole') called at > /usr/local/lib/perl5/site_perl/5.12.2/i686-linux/Moose/Util.pm line 87 > Moose::Util::apply_all_roles('Moose::Meta::Class=HASH(0xa41c068)', > 'SomeRole') called at borked.pm line 19 require borked.pm called > at <anonymous component> line 5 HTML::Mason::Commands::BEGIN() > called at borked.pm line 0 eval {...} called at borked.pm line 0 > eval 'package HTML::Mason::Commands; > use strict; > use vars qw($m); > HTML::Mason::Component->new( > \'code\' => sub { > $m->debug_hook( $m->current_comp->path ) if ( > HTML::Mason::Compiler::IN_PERL_DB() ); > > #line 4 "<anonymous component>" > > use borked; > #line 1 "<anonymous component>" > > print "Hello World!\\n"; > ;return; > }, > \'load_time\' => 1285719534, > > ) > ;' called at /usr/local/lib/perl5/site_perl/5.12.2/HTML/Mason/Interp.pm > line 844 > HTML::Mason::Interp::_do_or_eval('HTML::Mason::Interp=HASH(0x99d2b50)', > 'HASH(0x9950b60)') called at > /usr/local/lib/perl5/site_perl/5.12.2/HTML/Mason/Interp.pm line 817 > > HTML::Mason::Interp::eval_object_code('HTML::Mason::Interp=HASH(0x99d2b50)', > 'object_code', 'SCALAR(0x99c9640)') called at > /usr/local/lib/perl5/site_perl/5.12.2/HTML/Mason/Interp.pm line 635 > eval {...} called at > /usr/local/lib/perl5/site_perl/5.12.2/HTML/Mason/Interp.pm line 635 > HTML::Mason::Interp::make_component(undef, 'comp_source', > '<%perl>\x{a} print "Hello World!\n";\x{a}</%perl>\x{a}<%init>\x{a}use > borked...') called at > /usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm line 418 > eval {...} called at > /usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm line 416 > MasonX::Shell::interp('MasonX::Shell=HASH(0x96d1620)', 'broken.html') > called at /usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm line 345 > MasonX::Shell::exec('MasonX::Shell=HASH(0x96d1620)') called at > /usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm line 123 > MasonX::Shell::shell('broken.html') called at /usr/local/bin/masonsh > line 11 Compilation failed in require at <anonymous component> line 5. > BEGIN failed--compilation aborted at <anonymous component> line 5. > > > Stack: > [/usr/local/lib/perl5/site_perl/5.12.2/HTML/Mason/Interp.pm:636] > [/usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm:418] > [/usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm:345] > [/usr/local/lib/perl5/site_perl/5.12.2/MasonX/Shell.pm:123] > [/usr/local/bin/masonsh:11] > > Okay, ready for the weird part? See that commented out "method foo"? > If I uncomment it, the error goes away. > > Copious details follow. :-) > > Last time I had a weird Moose error, someone asked me about version > numbers of various modules, so here they are in case someone wants to > know: > > perl -MMooseX::Declare -le 'no strict qw<refs>; our $ver = > "${_}::VERSION" and print "$_ :: $$ver" foreach qw<Moose > MooseX::Declare MooseX::Method::Signatures Class::MOP Devel::Declare>' > Moose :: 1.14 > MooseX::Declare :: 0.34 > MooseX::Method::Signatures :: 0.36 > Class::MOP :: 1.08 > Devel::Declare :: 0.006000 > > Changing the code in various ways makes the error (or the hacky fix) > change in weird ways too: > > 1) Taking out the MooseX::Declare and declaring everything > vanilla-Moose-style makes it work. > > 2) However, it doesn't seem to be MooseX::Declare as much as it is > MooseX::Method::Signatures. Just changing the "method some_method" to > "sub some_method" makes it work. > > 3) But then changing "method foo" to "sub foo" not only keeps it > broken, but makes the "fix" not work either. > > 4) I tried taking the MooseX::Declare out and using MMS directly: > > { > package SomeRole; > use Moose::Role; > requires 'some_method'; > } > > > { > package SomeClass; > use Moose; > use MooseX::Method::Signatures; > > with 'SomeRole'; > > method some_method > { > } > #method foo {} > > } > > 1; > > This also keeps it broken, and negates the "fix." > > 5) For the ultimate weirdness, this: > > { > package SomeRole; > use Moose::Role; > requires 'some_method'; > } > > > use MooseX::Declare; > > class SomeClass with SomeRole > { > > method some_method { } > #method foo {} > > } > > 1; > > actually fixes it altogether. (The difference between this one and > the original is subtle: it's the fact that the braces are on the same > line as as the method now.) > > So I have apparently stumbled upon some bizarre juxtabug involving all > of Perl 5.12, Mason, and MooseX::Method::Signatures, and possibly > MooseX::Declare (which at least changes the behavior in that it allows > the bizarre "fix" of adding a useless method at the end). I have > literally no idea how to proceed from here. Does anyone have any > suggestions for me? Are there more details I can provide? > > Thanx all you Moosites for all your help. Working with Moose over the > past 9 months or so has really been awesome (despite the fact that I > keep popping up here with weird errors :-D ). > > > -- Buddy >
