Acme-FishFarm
view release on metacpan or search on metacpan
lib/Acme/FishFarm/OxygenMaintainer.pm view on Meta::CPAN
=head1 NAME
Acme::FishFarm::OxygenMaintainer - Oxygen Maintainer for Acme::FishFarm
=head1 VERSION
Version 1.01
=cut
our $VERSION = '1.01';
=head1 SYNOPSIS
use 5.010;
use Acme::FishFarm qw(consume_oxygen reduce_precision);
use Acme::FishFarm::OxygenMaintainer;
my $oxygen = Acme::FishFarm::OxygenMaintainer->install( DO_generation_volume => 3 );
say "Oxygen maintainer installed!\n";
while ( "fish are using up oxygen" ) {
say "Current Oxygen Level: ", $oxygen->current_DO, " mg/L",
" (low: < ", $oxygen->DO_threshold, ")";
#say "Low Oxygen Level: ", $oxygen->DO_threshold, " mg/L";
if ( $oxygen->is_low_DO ) {
say "Fish status: Suffocating";
say " !! Low oxygen level!";
say "Pumping ", $oxygen->oxygen_generation_volume, " mg/L of oxygen into the water..." ;
$oxygen->generate_oxygen;
} else {
say "Fish status: Happy";
}
consume_oxygen( $oxygen, rand(2.5) );
sleep(3);
say "";
}
=head1 EXPORT
None
=head1 CREATION RELATED SUBROUTINES/METHODS
=head2 install ( %options )
Installs an oxygen maintainer system.
The supported C<%options> are:
=over 4
=item current_DO
The default DO is to C<8 mg/L>.
=item DO_threshold
The default threshold is C<5 mg/L>.
If the current DO level is lower than this threshold, then your fish is lacking oxygen.
=item DO_generation_volume
This is the rate of oxygen generation.
The default value is C<0.2 mg/L per unit time>
=back
The unit C<mg/L> is just a unit, it doesn't show up if you call any of it's related getters.
=cut
sub install {
my $class = shift;
my %options = @_;
if ( not $options{current_DO} ) {
$options{current_DO} = 8;
}
if ( not $options{DO_threshold} ) {
$options{DO_threshold} = 5;
}
if ( not $options{DO_generation_volume} ) {
$options{DO_generation_volume} = 0.2;
}
$options{is_DO_low} = 0; # might be useless :)
bless \%options, "Acme::FishFarm::OxygenMaintainer";
}
=head1 DISSOLVED OXYGEN SENSOR RELATED METHODS
=head2 current_DO ( $new_DO )
Sets / returns the current DO level of the water.
C<$new_DO> is optional. If present, the current DO will be set to C<$new_DO>. Otherwise, returns the current DO reading.
=cut
sub current_DO {
ref( my $self = shift ) or croak "Please use this the OO way";
if ( @_ ) {
$self->{current_DO} = shift;
} else {
$self->{current_DO};
}
}
=head2 DO_threshold
Returns the DO threshold.
=cut
sub DO_threshold {
ref( my $self = shift ) or croak "Please use this the OO way";
$self->{DO_threshold};
}
( run in 0.532 second using v1.01-cache-2.11-cpan-5a3173703d6 )