package Sprocket::Plugin;
use Class::Accessor::Fast;
use base qw(Class::Accessor::Fast);
use Scalar::Util qw( weaken );
use POE;
use Sprocket;
__PACKAGE__->mk_accessors( qw( name parent_id ) );
use overload '""' => sub { shift->as_string(); };
use strict;
use warnings;
sub new {
my $class = shift;
bless( {
&adjust_params
}, ref $class || $class );
}
sub as_string {
warn "This Sprocket plugin should have been subclassed!";
__PACKAGE__;
}
sub handle_event {
my ( $self, $event ) = ( shift, shift );
return $self->$event( @_ )
if ( $self->can( $event ) );
return undef;
}
sub _log {
$poe_kernel->call( shift->parent_id => _log => ( call => ( caller(1) )[ 3 ], @_ ) );
return undef;
}
sub take_connection {
my ( $self, $con ) = @_;
$con->plugin( $self->name );
return 1;
}
sub release_connection {
my ( $self, $con ) = @_;
$con->plugin( undef );
return 1;
}
sub time_out {
my ( $self, $server, $con, $time ) = @_;
$server->_log( v => 4, msg => "Timeout for connection $con" );
$con->close();
return undef;
}
sub local_accept {
my ( $self, $server, $con, $socket ) = @_;
$con->accept();
return 1;
}
sub remote_accept {
my ( $self, $server, $con, $socket ) = @_;
$con->accept();
return 1;
}
sub remote_connect_error {
my ( $self, $server, $con ) = @_;
$con->close();
return 1;
}
sub remote_disconnected {
my ( $self, $server, $con ) = @_;
$con->close();
return 1;
}
sub remote_resolve_failed {
my ( $self, $server, $con ) = @_;
$con->close();
return 1;
}
1;
__END__
=pod
=head1 NAME
Sprocket::Plugin - Base class for Sprocket plugins
=head1 SYNOPSIS
use Sprocket qw( Plugin );
use base qw( Sprocket::Plugin );
sub new {
shift->SUPER::new(
name => 'MyPlugin',
@_
);
}
sub as_string {
__PACKAGE__;
}
...
=head1 ABSTRACT
This is a base class for Sprocket plugins. It provides several default methods
for easy plugin implementation.
=head1 NOTES
A plugin can define any of the methods below. All are optional, but a plugin
should have a conncted and a recieve method for it to function. See the
Sprocket site for examples. L Plugins should use the
template in the SYNOPSIS.
=head1 METHODS
=head2 Server Methods
These are methods that can be defined in a plugin for Sprocket server instances
=over 4
=item local_accept
Called with ( $self, $server, $con, $socket )
Defining this method is optional. The default behavior is to accept the
connection. You can call $con->reject() or $con->accept() to reject or
accept a connection. You can also call $self->take_connection( $con );
in this phase. See L for more information on the
accept and reject methods.
=item local_connected
Called with ( $self, $server, $con, $socket )
This is the last chance for a plugin to take a connection with
$self->take_connection( $con ); You should apply your filters for the
connection in this method. See L for details on how
to access the connection's filters.
=item local_receive
Called with ( $self, $server, $con, $data )
$data is the data from the filter applied to the connection.
=item local_disconnected
Called with ( $self, $server, $con, $error )
If error is true, then $operation, $errnum, and $errstr will also be defined
after $error. If a connection was closed with $con->close() then $error
will be false. If a connection was closed remotely but without an error then
$error will be true, but $errnum will be 0. For more details, see ErrorEvent
in L.
=back
=head2 Client Methods
These are methods that can be defined in a plugin for Sprocket client instances
=over 4
=item remote_accept
Why is there an accept method for client connections?!
Well, good question. This method is here to allow you to set the filters
and blocksize using the $con-accept method. See L
See local_accept.
=item remote_connected
See local_connected.
=item remote_receive
See local_receive.
=item remote_disconnected
See local_disconnected.
You can call $con->reconnect() to attempt to reconnect to the original host.
=item remote_connect_error
Called with ( $self, $client, $con, $operation, $errnum, $errstr )
See ErrorEvent in L. This is called when a connection
couldn't be established.
=item remote_resolve_failed
Called with ( $self, $client, $con, $response_error, $response_obj )
Sprocket uses L internally. Connections to ip's
are not resolved.
=back
=head1 SEE ALSO
L, L, L
=head1 AUTHOR
David Davis Exantus@cpan.orgE
=head1 COPYRIGHT AND LICENSE
Copyright 2006-2007 by David Davis
See L for license information.
=cut