cvs commit: qpsmtpd/lib/Qpsmtpd Plugin.pm
[email protected] (Robert Spier)
| Newsgroups | perl.cvs.qpsmtpd |
|---|---|
| Message-ID | <[email protected]> |
cvsuser 04/09/06 22:07:20
Modified: lib/Qpsmtpd Plugin.pm
Log:
Add the wrap_plugin function to allow for plugin wrapping
Revision Changes Path
1.11 +33 -0 qpsmtpd/lib/Qpsmtpd/Plugin.pm
Index: Plugin.pm
===================================================================
RCS file: /cvs/public/qpsmtpd/lib/Qpsmtpd/Plugin.pm,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -r1.10 -r1.11
--- Plugin.pm 31 Aug 2004 01:58:57 -0000 1.10
+++ Plugin.pm 7 Sep 2004 05:07:20 -0000 1.11
@@ -52,4 +52,37 @@
shift->qp->connection;
}
+sub wrap_plugin {
+ my ($self, $plugin_file, @args) = @_;
+
+ # Wrap all of the methods in an existing plugin so that functions
+ # can easily be replaced. Yes, we could use something like
+ # Hook::Lexwrap isntead, but since it's only 15 lines of code, might
+ # as well do it ourself.
+
+ # Static methods in plugins will probably not work right in this
+ # scheme.
+
+ # Load the new plugin under our namespace.
+ my $newPackage = __PACKAGE__."::_wrap_";
+ Qpsmtpd::_compile($self->plugin_name, $newPackage, $plugin_file)
+ unless defined &{"${newPackage}::register"};
+
+ no strict 'refs';
+ my $currentPackage = ref $self;
+ local *{${newPackage}."::register_hook"} = sub {
+ if (defined &{ $currentPackage . "::$_[2]"}) {
+ # We're wrapping this hook. Store the old value in $self-{_wrap_FUNC}
+ $self->{"_wrap_".$_[2]} = \&{${newPackage}."::$_[2]"};
+ } else {
+ # We're not wrapping this hook. Alias it into our namespace.
+ *{$currentPackage."::$_[2]"} = \&{${newPackage}."::$_[2]"};
+ }
+ $self->register_hook($_[1],$_[2]);
+ };
+
+ $self->{_wrapped_package} = $newPackage;
+ $newPackage->register($self->{_qp},@args);
+}
+
1;