POE-Declare-Log-File
view release on metacpan or search on metacpan
lib/POE/Declare/Log/File.pm view on Meta::CPAN
return 1;
}
# Initiate a flush event if we aren't doing one already
if ( $self->{state} eq 'IDLE' ) {
$self->{state} = 'BUSY';
$self->post('flush');
return 1;
}
# Message is delayed
return 0;
}
######################################################################
# Event Methods
sub startup : Event {
if ( $_[SELF]->Lazy ) {
if ( defined $_[SELF]->{buffer} ) {
# Open the file immediately
$_[SELF]->{Handle} = $_[SELF]->_handle;
} else {
# Switch to lazy start mode
$_[SELF]->{state} = 'LAZY';
return;
}
}
# Connect to the handle
$_[SELF]->post('connect');
}
sub connect : Event {
# Create the read/write wheel on the filehandle
$_[SELF]->{wheel} = POE::Wheel::ReadWrite->new(
Handle => $_[SELF]->Handle,
Filter => POE::Filter::Stream->new,
AutoFlush => 1,
FlushedEvent => 'flush',
ErrorEvent => 'error',
);
$_[SELF]->{state} = 'IDLE';
# Do an initial queue flush if we have anything
if ( defined $_[SELF]->{buffer} ) {
$_[SELF]->{state} = 'BUSY';
$_[SELF]->post('flush');
}
return;
}
sub flush : Event {
if ( defined $_[SELF]->{buffer} ) {
# Almost all the time we should arrive here already
# busy. But if we do arrive IDLE accidentally, set as well.
if ( $_[SELF]->{state} eq 'IDLE' ) {
$_[SELF]->{state} = 'BUSY';
}
# Merge the queued messages ourself to prevent having to use a heavier
# POE line filter in the Read/Write wheel.
$_[SELF]->{wheel}->put( delete $_[SELF]->{buffer} );
$_[SELF]->{buffer} = undef;
} else {
# Nothing (left) to do
if ( $_[SELF]->{state} eq 'HALT' ) {
$_[SELF]->{state} = 'STOP';
$_[SELF]->finish;
$_[SELF]->ShutdownEvent;
} else {
$_[SELF]->{state} = 'IDLE';
}
}
return;
}
sub error : Event {
$_[SELF]->{state} = 'CRASH';
# Prevent additional message and flush queue
delete $_[SELF]->{buffer};
# Clean up streaming resources
$_[SELF]->clean;
return;
}
sub shutdown : Event {
my $state = $_[SELF]->{state};
# Superfluous crash shutdown
if ( $state eq 'CRASH' ) {
$_[SELF]->finish;
$_[SELF]->ShutdownEvent;
return;
}
# Shutdown with nothing pending to write
if ( $state eq 'IDLE' or $state eq 'LAZY') {
$_[SELF]->{state} = 'STOP';
$_[SELF]->finish;
$_[SELF]->ShutdownEvent;
return;
}
# Shutdown while writing
if ( $state eq 'BUSY' ) {
# Signal we want to stop as soon as the queue is empty,
# but otherwise just wait for the natural end.
$_[SELF]->{state} = 'HALT';
return;
( run in 2.028 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )