« 週末京都 | メイン | 高野健一 Yes. »

CGI::Application::Plugin

完全な思いつき&パクリ。

package CGI::Application::Plugin;

use 5.006;
use strict;
use attributes ();

our $VERSION = 0.01;

# Code stolen from Class::DBI::Plugin 
# Code stolen from Simon Cozens (Maypole)
our %remember;
sub MODIFY_CODE_ATTRIBUTES { $remember{ $_[1] } = $_[2]; () }
sub FETCH_CODE_ATTRIBUTES { $remember{ $_[1] } }

sub import {
    my $class  = shift;
    my $caller = caller;
    no strict 'refs';
    for my $symname ( keys %{"$class\::"} ) {
        local *sym = ${"$class\::"}{$symname};
        next unless defined &sym;    # We're only in it for the subroutines
        &sym($caller), next
          if $symname eq 'init';
        *{"$caller\::$symname"} = \&sym
          if grep { defined($_) and $_ eq 'Plugged' } attributes::get( \&sym );
    }
}

1;


`Class::DBI::Plugin` =~ s/Class::DBI/CGI::Application/g;
しただけ。

SYNOPSISはこんな感じ。

  package CGI::Application::Plugin::NewPlugin;

  use strict;
  use base 'CGI::Application::Plugin';
  
  sub init {
    my $class = shift;
    $class->add_callback( 'prerun',  ... );
    $class->new_hook('newhook');
  }
  
  sub method_name : Plugged {
    my $self = shift;
    ....
  }

  sub this_method_is_not_exported {}


便利だと思ったり、でも今更間があったり。

ソース:http://svn.nomadscafe.jp/public/library/perl/CGI-Application-Plugin/