Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

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

by Arunbear (Parson)
on Jun 01, 2013 at 14:06 UTC ( #1036442=note: print w/ replies, xml ) Need Help??


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

Sorry, the verbose syntax example I gave was wrong. It would actually be like this:

#!/usr/bin/perl use strict; use warnings; package Foo::Sorted; use Attribute::Handlers; sub Sorted :ATTR { print "all sorted" } package main; my Foo::Sorted $tst :Sorted;


Comment on Re^3: RFC: Simulating Python's @decorators in Perl with Attributes
Download Code
Re^4: RFC: Simulating Python's @decorators in Perl with Attributes
by LanX (Canon) on Jun 01, 2013 at 14:18 UTC
    But if you worry about name collision in UNIVERSAL (which isn't my biggest concern) why don't you just import the attribute Sorted into the current package?

    Cheers Rolf

    ( addicted to the Perl Programming Language)

      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.
        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://1036442]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2014-11-29 06:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (203 votes), past polls