/usr/share/perl5/Aspect/Point/Functions.pm is in libaspect-perl 1.04-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | package Aspect::Point::Functions;
=pod
=head1 NAME
Aspect::Point::Functions - Allow point context methods to be called as functions
=head1 SYNOPSIS
use Aspect::Point::Functions;
# This code is equivalent to the SYNOPSIS for Aspect::Point
my $advice_code = sub {
print type; # The advice type ('before')
print pointcut; # The matching pointcut ($pointcut)
print enclosing; # Access cflow pointcut advice context
print sub_name; # The full package_name::sub_name
print package_name; # The package name ('Person')
print short_name; # The sub name (a get or set method)
print self; # 1st parameter to the matching sub
print (args)[1]; # 2nd parameter to the matching sub
original->( x => 3 ); # Call matched sub independently
return_value(4) # Set the return value
};
=head1 DESCRIPTION
In the AspectJ toolkit for Java which L<Aspect> is inspired by, the join point
context information is retrieved through certain keywords.
In L<Aspect> this initially proved too difficult to achieve without heavy
source code rewriting, and so an alternative approach was taken using a topic
object and methods.
This B<experimental> package attempts to implement the original function/keyword
style of call.
It is considered unsupported at this time.
=cut
use strict;
use Exporter ();
use Aspect::Point ();
our $VERSION = '1.04';
our @ISA = 'Exporter';
our @EXPORT = qw{
type
pointcut
original
sub_name
package_name
short_name
self
wantarray
args
exception
return_value
enclosing
topic
proceed
};
sub type () {
$_->{type};
}
sub pointcut () {
$_->{pointcut};
}
sub original () {
$_->{original};
}
sub sub_name () {
$_->{sub_name};
}
sub package_name () {
my $name = $_->{sub_name};
return '' unless $name =~ /::/;
$name =~ s/::[^:]+$//;
return $name;
}
sub short_name () {
my $name = $_->{sub_name};
return $name unless $name =~ /::/;
$name =~ /::([^:]+)$/;
return $1;
}
sub self () {
$_->{args}->[0];
}
sub wantarray () {
$_->{wantarray};
}
sub args {
if ( defined CORE::wantarray ) {
return @{$_->{args}};
} else {
@{$_->{args}} = @_;
}
}
sub exception (;$) {
unless ( $_->{type} eq 'after' ) {
Carp::croak("Cannot call exception in $_->{exception} advice");
}
return $_->{exception} if defined CORE::wantarray();
$_->{exception} = $_[0];
}
sub return_value (;@) {
# Handle usage in getter form
if ( defined CORE::wantarray() ) {
# Let the inherent magic of Perl do the work between the
# list and scalar context calls to return_value
return @{$_->{return_value} || []} if $_->{wantarray};
return $_->{return_value} if defined $_->{wantarray};
return;
}
# We've been provided a return value
$_->{exception} = '';
$_->{return_value} = $_->{wantarray} ? [ @_ ] : pop;
}
sub enclosing () {
$_[0]->{enclosing};
}
sub topic () {
Carp::croak("The join point method topic in reserved");
}
sub proceed () {
my $self = $_;
unless ( $self->{type} eq 'around' ) {
Carp::croak("Cannot call proceed in $self->{type} advice");
}
local $_ = ${$self->{topic}};
if ( $self->{wantarray} ) {
$self->return_value(
Sub::Uplevel::uplevel(
2,
$self->{original},
@{$self->{args}},
)
);
} elsif ( defined $self->{wantarray} ) {
$self->return_value(
scalar Sub::Uplevel::uplevel(
2,
$self->{original},
@{$self->{args}},
)
);
} else {
Sub::Uplevel::uplevel(
2,
$self->{original},
@{$self->{args}},
);
}
${$self->{topic}} = $_;
return;
}
1;
=pod
=head1 AUTHORS
Adam Kennedy E<lt>adamk@cpan.orgE<gt>
=head1 COPYRIGHT
Copyright 2011 Adam Kennedy.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
|