Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re^5: RFC: Simulating Python's @decorators in Perl with Attributes

by Arunbear (Parson)
on Jun 02, 2013 at 18:32 UTC ( #1036610=note: print w/ replies, xml ) Need Help??


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.


Comment on Re^5: RFC: Simulating Python's @decorators in Perl with Attributes
Select or Download Code
Re^6: RFC: Simulating Python's @decorators in Perl with Attributes (exporting attributes)
by LanX (Canon) 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().

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1036610]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (18)
As of 2014-09-02 15:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (25 votes), past polls