The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Protocol::WebSocket::Stateful;

use strict;
use warnings;

sub new {
    my $class = shift;
    $class = ref $class if ref $class;

    my $self = {@_};
    bless $self, $class;

    return $self;
}

sub state { @_ > 1 ? $_[0]->{state} = $_[1] : $_[0]->{state} }

sub done     { shift->state('done') }
sub is_state { shift->state eq shift }
sub is_body  { shift->is_state('body') }
sub is_done  { shift->is_state('done') }

1;
__END__

=head1 NAME

Protocol::WebSocket::Stateful - Base class for all classes with states

=head1 DESCRIPTION

A base class for all classes with states.

=head1 ATTRIBUTES

=head2 C<state>

=head1 METHODS

=head2 C<new>

Create a new L<Protocol::WebSocket::Stateful> instance.

=head2 C<done>

=head2 C<is_state>

=head2 C<is_body>

=head2 C<is_done>

=cut