package AHappli::Plugins; use strict; use Attribute::Handlers; use AHappli; my @init_table; my @print_table; my @end_table; my %plugin; sub Init : ATTR(CODE) { my($package, $symbol, $referent, $attr, $data, $phase) = @_; push (@init_table, {pkg => $package, method => *{$symbol}{NAME}, referent => $referent, data => $data}); } sub Print : ATTR(CODE) { my($package, $symbol, $referent, $attr, $data, $phase) = @_; push (@print_table, {pkg => $package, method => *{$symbol}{NAME}, referent => $referent, data => $data}); } sub End : ATTR(CODE) { my($package, $symbol, $referent, $attr, $data, $phase) = @_; push (@end_table, {pkg => $package, method => *{$symbol}{NAME}, referent => $referent, data => $data}); } sub do_init { foreach (@init_table) { my $pkg = $_->{pkg}; my $method = $_->{method}; my $val; eval qq(\$val = ${pkg}->${method}); next if $@; $plugin{$pkg} = bless { val => $val, data => $_->{data}, }, $pkg; } foreach (@print_table, @end_table) { my $pkg = $_->{pkg}; $plugin{$pkg} = bless {}, $pkg unless ref($plugin{$pkg}) eq $pkg; } } sub do_print { my $class = shift; my $c = shift; foreach (@print_table) { my $pkg = $_->{pkg}; next unless ref($plugin{$pkg}) eq $pkg; my $method = $_->{method}; $plugin{$pkg}->$method($c); } } sub do_end { my $class = shift; foreach (@end_table) { my $pkg = $_->{pkg}; next unless ref($plugin{$pkg}) eq $pkg; my $method = $_->{method}; $plugin{$pkg}->$method; } } 1;