package CGI::Kwiki::Plugin; use strict; use base 'CGI::Kwiki', 'CGI::Kwiki::Privacy'; use CGI::Kwiki; use Cwd 'abs_path'; attribute 'can_do'; sub new { my ($class, $driver) = @_; my $self = $class->SUPER::new($driver); $self->can_do({map { ($_, 1) } $self->methods}); return $self; } sub load { my ($self, $plugin) = @_; my $plugin_module = -f "./plugins/$plugin.pm" ? "'" . abs_path . "/plugins/$plugin.pm'" : "CGI::Kwiki::Plugin::$plugin"; my $class_name = "CGI::Kwiki::Plugin::$plugin"; eval qq{ require $plugin_module }; die "Can't find a plugin class for '$plugin':\n$@" if $@; $class_name->new($self->driver); } sub call { my ($self, $plugin, $method, @args) = @_; my $plugin_obj = $self->load($plugin); die "Can't call method '$method' for plugin '$plugin'" unless defined $plugin_obj->can_do->{$method}; $plugin_obj->$method(@args); } sub call_packed { my ($self, $packed1, $packed2) = @_; my ($plugin, $method) = split /\./, $packed1; my @args = split /\s+/, $packed2; $self->call($plugin, $method, @args); } sub methods { (); } sub process { my ($self) = @_; my $class = ref $self; die "No method 'process' defined for '$class'" unless $class eq __PACKAGE__; my $plugin_name = $self->cgi->plugin_name; $self->load($plugin_name)->process; } 1; __END__ =head1 NAME CGI::Kwiki::Plugin - Plugin Base Class for CGI::Kwiki =head1 DESCRIPTION See installed kwiki pages for more information. =head1 AUTHOR Brian Ingerson =head1 COPYRIGHT Copyright (c) 2003. Brian Ingerson. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://www.perl.com/perl/misc/Artistic.html =cut