package riddle; # makes a riddle object # define class attributes use fields qw(riddle state); # the new array-as-hash thingy # riddles our %RID = ( "wind" => < < < < < <{riddle} = $ANS[rand $#ANS + 1]; $ph->{state} = 0; print STDERR "Created new object: $ph\n"; # my $ph = fields::phash( riddle=> $ANS[rand $#ANS + 1] , state => 0 ); bless $ph, $class; } sub new_riddle { my $this = shift; $this->state(0); $this->{riddle} = $ANS[ rand $#ANS + 1]; } sub riddle_text { return $RID{ shift->{riddle} }; } sub riddle { return shift->{riddle}; } sub state { # 0 guessing, 1 guessed my $this = shift; return $this->{state} unless @_; $this->{state} = $_[0]; } sub guess { my $this = shift; die "Guessed already" if $this->state(); my $ans = shift; my $r = $this->riddle(); if ( $ans =~ /^$r/i ) { $this->state(1); return 1; } } # riddle protocol sub protocol { my $this = shift; my $msg_in = shift; my $msg_out; return undef if $msg_in && $msg_in =~ /^(quit|exit)/i; if ( $this->guess($msg_in) ) { $msg_out = "Good guess!\nNew riddle:\n"; $this->new_riddle(); } elsif ($msg_in) { $msg_out = "Try again!\n"; } else { $msg_out = "Make a guess!\n"; } $msg_out .= $this->riddle_text; return $msg_out; } 1;