File Coverage

blib/lib/Plugin/System.pm
Criterion Covered Total %
statement 6 35 17.1
branch 0 10 0.0
condition n/a
subroutine 2 9 22.2
pod 0 3 0.0
total 8 57 14.0


line stmt bran cond sub pod time code
1             ## no critic: TestingAndDebugging::RequireUseStrict
2             package Plugin::System;
3              
4             #IFBUILT
5 1     1   382074 use strict 'subs', 'vars';
  1         2  
  1         60  
6 1     1   6 use warnings;
  1         2  
  1         1013  
7             #END IFBUILT
8              
9             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
10             our $DATE = '2024-03-02'; # DATE
11             our $DIST = 'Plugin-System'; # DIST
12             our $VERSION = '0.000001'; # VERSION
13              
14             our $re_addr = qr/\(0x([0-9a-f]+)/o;
15              
16             our %Target_Packages; # key=package name, value=1
17             our %Per_Package_Handlers; # key=package name, value={ $hook=>$handlers, ... }
18              
19             my $sub0 = sub {0};
20             my $sub1 = sub {1};
21              
22             sub install_routines {
23 0     0 0   my ($target_pkg, $routines) = @_;
24              
25 0 0         if (!defined &subname) {
26             #if (eval { require Sub::Name; 1 }) {
27             # *subname = \&Sub::Name::subname;
28             #} else {
29 0     0     *subname = sub {};
30             #}
31             }
32              
33 0           for my $r (@$routines) {
34 0           my ($code, $name) = @$r;
35 0           *{"$target_pkg\::$name"} = $code;
  0            
36 0           subname("$target_pkg\::$name", $code);
37             }
38             }
39              
40             sub add_target {
41 0     0 0   my ($pkg, %args) = @_;
42              
43             # check arguments
44 0 0         my $hooks = delete $args{hooks} or die "Please specify 'hooks' argument";
45 0 0         for (keys %$hooks) { /\A\w+\z/ or die "Invalid syntax in hook name '$_', please use alphanumeric only" };
  0            
46              
47 0 0         keys %args and die "Unknown argument(s): ".join(", ", sort keys %args);
48              
49             # if already defined, overwrite previous configuration
50 0           $Target_Packages{$pkg} = {hooks => $hooks};
51             }
52              
53             sub init_target {
54 0     0 0   my $pkg = shift;
55              
56 0 0         my $args = $Target_Packages{$pkg} or die "Package '$pkg' has not been added as target yet";
57              
58 0           my $routines = [];
59 0           for my $hook (keys %{ $args->{hooks} }) {
  0            
60 0     0     push @$routines, [sub(;&@) { shift->() }, "hook_$hook"];
  0            
61             }
62 0           install_routines($pkg, $routines);
63             }
64              
65             sub _import_to {
66 0     0     my $pkg = shift;
67 0           my $target_pkg = shift;
68              
69 0           add_target($target_pkg, @_);
70 0           init_target($target_pkg);
71             }
72              
73             sub import {
74 0     0     my $pkg = shift;
75              
76 0           my $caller = caller(0);
77 0           $pkg->_import_to($caller, @_);
78             }
79              
80             1;
81             # ABSTRACT: A plugin system for your Perl framework or application
82              
83             __END__