/usr/local/CPAN/Forks-Super/Forks/Super/Tie/Enum.pm


package Forks::Super::Tie::Enum;
use Carp;
use strict;
use warnings;
use vars qw(%ATTR %VALUE);

# A tie'd scalar value that can only take on values
# from a pre-specified list.
# Used in Forks::Super for $ON_BUSY and $QUEUE_INTERRUPT

sub TIESCALAR {
  my ($class, @attr) = @_;
  my $self;
  bless \$self, $class;
  $VALUE{\$self} = $attr[0];
  $ATTR{\$self} = [ @attr ];
  return \$self;
}

sub FETCH {
  my $self = shift;
  return $VALUE{$self};
}

sub STORE {
  my ($self,$value) = @_;
  foreach my $attr (@{$ATTR{$self}}) {
    if (uc $value eq uc $attr) {
      $VALUE{$self} = $attr;
      return;
    }
  }
  if ($ATTR{""}) {
    $VALUE{$self} = "";
  } else {
    carp "Invalid assignment to enumerated tied scalar\n";
  }
  return;
}

sub _has_attr {
  my ($obj, $value) = @_;
  foreach my $attr (@{$ATTR{$obj}}) {
    if (uc $value eq uc $attr) {
      return 1;
    }
  }
  return 0;
}

sub _get_value {
  my ($obj) = @_;
  return $VALUE{$obj};
}

1;