Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Core module: Attribute::Handlers behaviour

by enigma (Novice)
on Oct 21, 2012 at 10:11 UTC ( #1000192=note: print w/ replies, xml ) Need Help??


in reply to Core module: Attribute::Handlers behaviour

Hello PerlMonks,

I understand the trick "BrowserUk" has suggested. I tried to implement the same as below but it is always giving me error as

Can't locate object method "new" via package "Module"

Module.pm

package Module; use Attribute::Handlers; sub TRACE :ATTR(CODE,BEGIN) { my ($pkg, $sym, $ref, $attr, $data, $phase, $file, $line) = @_; *{ $sym } = sub { warn "$file($line) called with [@_]\n"; my( @rc )= &$ref; warn "$file($line): returning [ @rc ]\n"; } } sub new :TRACE{ my $instance = shift; my $class = ref($instance) || $instance; my $self = {}; return bless($self, $class); } 1;

Test.pl

#!/usr/local/bin/perl my $module_to_load = 'Module'; eval "use $module_to_load;"; # Create object my $obj = Module->new(); print "CLASS: " . ref($obj) ."\n";

When i'm changing the execution phase in ATTR to INIT,CHECK - module gets compiled successfully but ATTR TRACE is not called. And when i change the phase to BEGIN, I'm getting the above error message.

I need your help to understand why my Test.pl is not able to find "new()" method in Module.pm when Attribute::Handers are called at BEGIN phase.

Thanks


Comment on Re: Core module: Attribute::Handlers behaviour
Select or Download Code
Re^2: Core module: Attribute::Handlers behaviour
by Anonymous Monk on Oct 21, 2012 at 10:46 UTC

    I don't get that, even though your module doesn't return an object ( compared to Attribute::Constructor ), trace gets called if the phase is BEGIN

    $ perl -le " eval qq/use Junk;/; print Junk->new " Junk.pm(22) called with [Junk] Junk.pm(22): returning [ Junk=HASH(0x3f8d1c) ] 1 $ cat Junk.pm package Junk; use Attribute::Handlers; #~ sub TRACE :ATTR(CODE,CHECK) { #~ sub TRACE :ATTR(CODE,INIT,CHECK) { #~ sub TRACE :ATTR(CODE,INIT) { sub TRACE :ATTR(CODE,BEGIN) { #~ sub TRACE :ATTR(CODE) { my ($pkg, $sym, $ref, $attr, $data, $phase, $file, $line) = @_; *{ $sym } = sub { warn "$file($line) called with [@_]\n"; my( @rc )= &$ref; warn "$file($line): returning [ @rc ]\n"; } } sub new :TRACE { my $instance = shift; my $class = ref($instance) || $instance; my $self = {}; return bless($self, $class); } 1;

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2015-07-06 05:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (70 votes), past polls