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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.