http://qs321.pair.com?node_id=770294


in reply to Sub attributes

I'm not sure I understand the question. Maybe this code example is what you're looking for?

use strict; use List::Extract 'extract'; sub MODIFY_CODE_ATTRIBUTES { my $class = shift; my ($cref, @attrs) = @_; my ($bent) = extract { /^Bent\b/ } @attrs; if (defined $bent) { print "Recognized attribute: $bent\n"; } return @attrs; # Unrecognized. } sub foo :Bent; sub bar :Bent(named) { 1 } my $code = sub :Bent(anonymous) { 1 } __END__ Recognized attribute: Bent Recognized attribute: Bent(named) Recognized attribute: Bent(anonymous)
This is documented in attributes under "Package-specific Attribute Handling".

What to do once a subroutine attribute is recognized is a completely different story. :-)

lodin

Replies are listed 'Best First'.
Re^2: Sub attributes
by John M. Dlugosz (Monsignor) on Jun 10, 2009 at 16:14 UTC
    So only built-in attributes are recognized globally? That would contradict the examples. He's not setting up any package-attribute handler; just using Bent. And cautioning against unrecognized in nearly the same breath.

      So only built-in attributes are recognized globally?

      Correct. And that is how it should be. You don't want global attributes any more than you want global subroutines. I'm not saying that I like the current implementation, but at least its good that the attributes are somewhat scoped.

      Since the handlers (MODIFY_CODE_ATTRIBUTES etc) are inherited one can add them to UNIVERSAL and achieve global attributes. Attribute::Handlers for instance uses this trick. This however makes it very dangerous to use attributes in modules, since attributes defined in different modules may clash. See also my previous meditation on the problems with attributes (it also links to other nodes about attributes).

      lodin