Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • I really think that doing anything that is equivalent the following is an incorrect usage of the feature more then it is a bug.

    Some::Role->meta->apply($object) while 1;

    You can simply modify this line slightly and avoid all your warnings by doing this ...

    while (1) {
        Some::Role->meta->apply($object) unless $object->does('Some::Role');
    }

    Sure it would be nice if Moose prevented you from shooting yourself in the foot like this, but what if you really wanted to shoot yourself i

    • I do see your point and I think you're right (I've some issues with implementation, but that's OK :). At the very least, though, I would like to see Moose::Role be able to generate a sane error message to make it easier to track bugs like this down.

      • The problem is that we are not considering it an error. The particular errors you were getting were tricky not because of something Moose::Role did as much as your repeated application of the role to the class caused really odd side effects to happen. How would I tell the difference between a error borne from side-effects and one that I could directly trace back to a mis-use of the feature?

        - Stevan

        • I'm not saying that Moose::Role is behaving in error here. I'm saying there's a detectable error condition and a better error message would help.

          How would I tell the difference between a error borne from side-effects and one that I could directly trace back to a mis-use of the feature?

          When applying a role at runtime, by noting Perl's recursive inheritance limit (98 role applications on my Solaris box) and issuing a reasonable error reporting the package/file/line number of role application, it would have been trivial for me to find the source error. Currently this error wins my personal "most obscure error message" award :)

          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Deep recursion on subroutine "Class::MOP::Class::class_precedence_list" at /home/poec01/branches/tagging/deps/lib/perl5/i86pc-solaris-thread-multi/Class/MO P/Class.pm line 602.
          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Deep recursion on subroutine "Class::MOP::Class::class_precedence_list" at /home/poec01/branches/tagging/deps/lib/perl5/i86pc-solaris-thread-multi/Class/MO P/Class.pm line 602.
          Deep recursion on subroutine "MRO::Compat::__get_linear_isa_dfs" at /home/poec01/branches/tagging/deps/lib/perl5/MRO/Compat.pm line 123.
          Recursive inheritance detected while looking for method '()' in package 'Moose::Object' at /home/poec01/branches/tagging/deps/lib/perl5/i86pc-solaris-thread-multi/Class/MO P/Instance.pm line 157.
          Recursive inheritance detected while looking for method '()' in package 'Moose::Object'.

          • Okay, I will agree that is could be detected, but how simple it is to do is another thing entirely. You are always invited to fork the Moose git repo and patch this if you like.

            - Stevan