use strict ; use warnings; sub insert_alias {print "insert $_[0]\n"; return 1} insert_alias('Mike'); insert_alias('SAINT'); #### use strict ; use warnings; sub insert_Nickname {print "insert $_[0]\n"; return 1} insert_Nickname('Jack'); insert_Nickname('Jill'); insert_Nickname('SAINT'); insert_Nickname('Saint'); #### # try_AspectPrecon1.pl use strict ; use warnings; use AspectPrecon qw/ pre_insert /; pre_insert()->enable; sub insert_alias {print "insert $_[0]\n"; return 1} insert_alias('Mike'); insert_alias('SAINT'); __END__ Sorry, SAINT has been reserved. at try_AspectPrecon1.pl line 10 main::insert_alias(Mike) is being called. insert Mike main::insert_alias(SAINT) is being called. #### package AspectPrecon; use strict ; use warnings; use Carp; use Exporter; use Aspect qw(advice calls); our @ISA = qw(Exporter); our @EXPORT_OK = qw(pre_insert); my $subc = sub { print $::thisjp->signature(@_) . " is being called.\n"; croak "Sorry, $_[0] has been reserved." if $_[0] =~ /saint/i; }; my $spec = qr/main::insert_.*/; my $pre_insert = advice(calls($spec), $subc); sub pre_insert {$pre_insert}; 1; #### # try_AspectPrecon2.pl use strict ; use warnings; use AspectPrecon qw/ pre_insert /; sub insert_Nickname {print "insert $_[0]\n"; return 1} insert_Nickname('Jack'); pre_insert()->enable; insert_Nickname('Jill'); pre_insert()->disable; insert_Nickname('SAINT'); pre_insert()->enable; insert_Nickname('Saint'); __END__ Sorry, Saint has been reserved. at try_AspectPrecon2.pl line 17 insert Jack main::insert_Nickname(Jill) is being called. insert Jill insert SAINT main::insert_Nickname(Saint) is being called. #### package AspectPostcon; use strict ; use warnings; use Exporter; use Aspect qw(advice returns); our @ISA = qw(Exporter); our @EXPORT_OK = qw(post_insert); my $subr = sub { print $::thisjp->sub . " has done its work.\n"; print "Tell God a $_[0] has been created.\n" if $_[0] =~ /saint/i; return 1; }; my $spec = qr/main::insert_.*/; my $post_insert = advice(returns($spec), $subr); sub post_insert {$post_insert}; 1; #### # try_AspectPostcon1.pl use strict ; use warnings; use AspectPostcon qw/ post_insert /; post_insert()->enable; sub insert_alias {print "insert $_[0]\n"; return 1} insert_alias('Mike'); insert_alias('SAINT'); __END__ insert Mike main::insert_alias has done its work. insert SAINT main::insert_alias has done its work. Tell God a SAINT has been created. #### # try_AspectPostcon2.pl use strict ; use warnings; use AspectPostcon qw/ post_insert /; post_insert()->enable; sub insert_Nickname {print "insert $_[0]\n"; return 1} insert_Nickname('Jack'); insert_Nickname('SAINT'); insert_Nickname('Jill'); insert_Nickname('Saint'); __END__ insert Jack main::insert_Nickname has done its work. insert SAINT main::insert_Nickname has done its work. Tell God a SAINT has been created. insert Jill main::insert_Nickname has done its work. insert Saint main::insert_Nickname has done its work. Tell God a Saint has been created.