The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package POEx::IRC::Backend::Role::HasWheel;
$POEx::IRC::Backend::Role::HasWheel::VERSION = '0.030001';
use Types::Standard -all;

use Moo::Role;

has wheel_id => (
  lazy    => 1,
  isa     => Defined,
  is      => 'ro',
  writer  => '_set_wheel_id',
  builder => sub { shift->wheel->ID },
);

has wheel => (
  required  => 1,
  isa       => Maybe[ InstanceOf['POE::Wheel'] ],
  is        => 'ro',
  clearer   => 'clear_wheel',
  writer    => 'set_wheel',
  predicate => 'has_wheel',
  trigger   => sub {
    my ($self, $wheel) = @_;
    $self->_set_wheel_id( $wheel->ID )
  },
);

1;

=pod

=for Pod::Coverage has_\w+

=head1 NAME

POEx::IRC::Backend::Role::HasWheel

=head1 SYNOPSIS

A L<Moo::Role> for classes that have associated POE::Wheel instances.

=head1 DESCRIPTION

=head2 wheel

A L<POE::Wheel> instance (typically L<POE::Wheel::SocketFactory> for listeners
and connectors or L<POE::Wheel::ReadWrite> for live connections).

This is primarily for internal use. External code should not interact directly
with the C<wheel>.

Can be cleared via B<clear_wheel>; use B<has_wheel> to determine if this
listener's wheel has been cleared.

Can be replaced via B<set_wheel> (although whether this is a good idea or not
is debatable; better to spawn a new instance of your class)

=head2 wheel_id

The POE ID of the last known L</wheel>.

=head1 AUTHOR

Jon Portnoy <avenj@cobaltirc.org>

=cut