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; }