The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Lingua::Shakespeare::Character;

use Carp;
use strict;

sub new {
  my $class = shift;
  my $name = shift;

  bless { value => 0, list => [], name => $name }, $class;
}


sub name {
  shift->{name}
}

sub value {
  shift->{value}
}

sub assign {
  my $self = shift;
  $self->{value} = shift;
}

sub int_input {
  my $self = shift;

  my $num = <STDIN>;

  croak $self->name . " had a heart attack"
    unless defined $num;

  chomp($num);

  croak $self->name . "'s heart whispered something that is not an integer"
    unless $num =~ /^-?\d+/;

  $self->{value} = $num;
}

sub int_output {
  my $self = shift;

  print $self->{value};
}

sub char_output {
  my $self = shift;

  print chr($self->{value} & 255);
}

sub char_input {
  my $self = shift;

  my $ch;
  $self->{value} = read(STDIN, $ch, 1) ? ord($ch) : -1;
}

sub push {
  my $self = shift;
  push @{ $self->{list} }, shift;
}

sub pop {
  my $self = shift;
  $self->{value} = pop @{ $self->{list} };
}

1;