package Flashlight;
sub new {
my $class = shift;
my $power = shift || 0;
my $level = shift || 0;
my $self = {
level => $level,
power => $power,
};
return bless $self, $class;
}
####
my $light = Flashlight->new(1,4);
##
##
use strict;
my $light = Flashlight->new();
my %menu = (
1 => ['Turn On', sub { $light->turn_on }],
2 => ['Turn Off', sub { $light->turn_off }],
3 => ['Toggle', sub { $light->toggle }],
4 => ['Flash', sub { print flash($light),"\n" }],
5 => ['Change Level', sub { change_level($light) }],
6 => ['Status', sub { print $light->to_string }],
7 => ['Exit', sub { exit }],
);
while(1) {
print menu();
chomp(my $choice = <>);
last if $choice =~ /^(exit|q|end|x|quit)/i;
next unless exists $menu{$choice};
&{$menu{$choice}->[1]};
}
sub menu {
my $string;
for (sort keys %menu) {
$string .= sprintf ("%d) %s\n",$_,$menu{$_}->[0]);
}
return $string . 'Enter choice:';
}
sub flash {
my $ref = shift;
return $ref->is_on
? "The flashlight is on already."
: "A flash of light beams through the air!"
}
sub change_level {
my $ref = shift;
print "Enter Level: ";
chomp (my $lvl=<>);
$ref->level($lvl);
print "Power is at ", $ref->level, "\n";
}
###############################################
package Flashlight;
# constructor
sub new {
my $class = shift;
my $power = shift || 0;
my $level = shift || 0;
my $self = {
level => $level,
power => $power,
};
return bless $self, $class;
}
# set method
sub turn_on {
my $self = shift;
$self->{'power'} = 1;
}
# set method
sub turn_off {
my $self = shift;
$self->{'power'} = 0;
}
# set method
sub toggle {
my $self = shift;
$self->{'power'} = ! $self->{'power'};
}
# get or set method
sub level {
my $self = shift;
my $level = shift;
return $self->{'level'} unless $level;
$self->{'level'} = $level;
}
# get method
sub is_on {
my $self = shift;
return $self->{'power'};
}
# get method
sub to_string {
my $self = shift;
my $string;
while (my($k,$v) = each %$self) {
$string .= "$k => " . ($v || 0) . "\n";
}
return $string;
}