Refactoring Proposal: Enhanced Plugin Architecture
Motivation
The current plugin mechanism don't allow the posibility to have OO-styled plugins wihout ugly hacks from the plugin side, as the handlers are registered by name (ie: using the
TWiki::Plugins::PluginName::Handlername style), which prevent OO-Styled plugins from receiving the $self reference as the first parameter.
Description
Modify the way the plugin handlers are registered and applied to allow OO-plugins to register their handlers without any ugly hack.
--
RafaelAlvarez - 01 Jul 2005
Impact and Available Solutions
Implementation
Here is the patch against DEVELOP 4483
Index: lib/TWiki/Plugins.pm
===================================================================
--- lib/TWiki/Plugins.pm (revision 4483)
+++ lib/TWiki/Plugins.pm (working copy)
@@ -311,12 +311,12 @@
my $handlerName = shift;
my $status;
- foreach my $handler ( @{$this->{registeredHandlers}{$handlerName}} ) {
+ foreach my $plugin ( @{$this->{registeredHandlers}{$handlerName}} ) {
# Set the value of $SESSION for this call stack
local $SESSION = $this->{session};
# apply handler on the remaining list of args
no strict 'refs';
- $status = &$handler;
+ my $status=$plugin->invoke($handlerName,@_);
use strict 'refs';
if( $status && $onlyOnceHandlers{$handlerName} ) {
return $status;
Index: lib/TWiki/Plugin.pm
===================================================================
--- lib/TWiki/Plugin.pm (revision 4483)
+++ lib/TWiki/Plugin.pm (working copy)
@@ -205,7 +205,7 @@
foreach my $h ( @registrableHandlers ) {
my $sub = $p.'::'.$h;
if( defined( &$sub )) {
- push( @{$plugins->{registeredHandlers}{$h}}, $sub );
+ push( @{$plugins->{registeredHandlers}{$h}}, $this );
if( $deprecated{$h} ) {
$this->{session}->writeWarning
( $this->{name}.' defines deprecated '.$h );
@@ -214,6 +214,17 @@
}
}
+# Invoke a handler
+sub invoke {
+ my $this=shift;
+ my $handlerName=shift;
+ my $handler = 'TWiki::Plugins::' . $this->{name}.'::'.$handlerName;
+ no strict 'refs';
+ my $status=&$handler;
+ use strict 'refs';
+ return $status;
+}
+
# Get the version number of the specified plugin.
# SMELL: may die if the plugin doesn't compile
sub getVersion {
The key change is to register plugin under each handler it has, and to move the responsability to invoke the handler from
PluginsDotPm to
PluginDotPm. That way, subclases of
PluginDotPm can override registerHandlers and invoke in any way they need them to be.
A nice "side effect" of the
DakarRelease architecture is that the current
PluginDotPm can serve as a wrapper for old-styled plugins.
--
RafaelAlvarez - 01 Jul 2005
Commited on v4484.
--
RafaelAlvarez - 01 Jul 2005
Discussion
Already merged, with more than 3 years in production, and counting
I updated the form, but as the
ChangeProposalForm changed, the new data is being displayed.
--
RafaelAlvarez - 08 Aug 2008