http://www.perlmonks.org?node_id=1036610


in reply to Re^4: RFC: Simulating Python's @decorators in Perl with Attributes
in thread RFC: Simulating Python's @decorators in Perl with Attributes

Importing the attribute does not seem to work:
# Foo.pm package Foo; use strict; use Attribute::Handlers; use Exporter 'import'; our @EXPORT = qw/Sorted/; sub Sorted :ATTR { print "all sorted" } 1; # attr.pl #!/usr/bin/perl use strict; use warnings; use Foo; my Foo $tst1 :Sorted; my $tst2 :Sorted; print "done\n";
It dies with
Invalid SCALAR attribute: Sorted at /home/arun/attr.pl line 8.

Replies are listed 'Best First'.
Re^6: RFC: Simulating Python's @decorators in Perl with Attributes (exporting attributes)
by LanX (Saint) on Jun 02, 2013 at 20:03 UTC
    yep, tried to analyze Attribute::Handlers but no time to dig into details.

    in the meantime, here a hack that works: (plz ignore, see UPDATE)

    package Foo; use strict; use Attribute::Handlers; sub import { my $pkg = (caller)[0]; eval <<"_code_"; sub ${pkg}::Sorted :ATTR { print "all sorted" } _code_ } 1;

    #!/usr/bin/perl use strict; use warnings; use Foo; $\="\n"; my $tst2 :Sorted; print "done\n"

    Beside of this:

    I think attributes could be monkey patched to check a dedicated package like 'UNIVERSAL::attributes" for global attributes.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

    UPDATE

    less hacky, more stable!

    package Foo; use strict; use Attribute::Handlers; sub import { my $src_pkg=__PACKAGE__; my $dest_pkg = (caller)[0]; my $import = "sub ${dest_pkg}::Sorted :ATTR { goto \&${src_pkg}::Sor +ted }"; eval $import; } sub Sorted { print "all sorted" } 1;

    the essential problem is that :ATTR stores the combination of package and coderef for every new attribute to be able to identify them later via findsym().