/usr/local/CPAN/Net-Gnutella/Net/Gnutella/Event.pm
package Net::Gnutella::Event;
use Carp;
use strict;
use vars qw/$VERSION %trans $AUTOLOAD/;
$VERSION = $VERSION = "0.1";
%trans = (
0 => "ping",
1 => "pong",
64 => "push",
128 => "query",
129 => "reply",
);
# Use AUTOHANDLER to supply generic attribute methods
#
sub AUTOLOAD {
my $self = shift;
my $attr = $AUTOLOAD;
$attr =~ s/.*:://;
return unless $attr =~ /[^A-Z]/; # skip DESTROY and all-cap methods
croak sprintf "invalid attribute method: %s->%s()", ref($self), $attr unless exists $self->{_attr}->{lc $attr};
$self->{_attr}->{lc $attr} = shift if @_;
return $self->{_attr}->{lc $attr};
}
# Instantiate an object, parent to all others
#
sub new {
my $class = shift;
my %args = @_;
my $self = {
_attr => {
packet => undef,
from => undef,
type => undef,
},
};
bless $self, $class;
foreach my $key (keys %args) {
my $lkey = lc $key;
$self->$lkey($args{$key});
}
return $self;
}
sub type {
my $self = shift;
if (@_) {
$self->{_attr}->{type} = $_[0] =~ /^\d/ ? $self->trans($_[0]) : $_[0];
}
return $self->{_attr}->{type};
}
sub trans {
shift if (ref($_[0]) || $_[0]) =~ /^Net::Gnutella/;
my $event = shift;
return (exists $trans{$event} ? $trans{$event} : undef);
}
1;