use warnings;
use strict;
use Test::More tests => 6;
use Attribute::StringifiableInteger;
my $integer : StringifiableInteger = 1;
ok($integer == 1);
is($integer, 'one');
is(sprintf("%d",$integer), 1);
is(sprintf("%s",$integer), 'one');
$integer = 3;
$integer += 1;
is($integer, 'four');
$integer++;
is($integer, 'five');
####
use warnings;
use strict;
package StringifiableInteger;
use Carp;
use overload
'""' => \&_to_string,
'0+' => \&_get,
'++' => sub {
my ($self) = @_;
$$self += 1;
return 'looks like the return value is not used.';
},
fallback => 1,
;
my $regex_integer = qr{
^
-?
\d+
$
}x;
sub new {
my ($class) = @_;
my $integer;
bless \$integer, $class;
}
sub set {
my ($self, $value) = @_;
croak "invalid integer value ($value)" unless $value =~ $regex_integer;
$$self = $value;
}
my @stringified = qw/zero one two three four five six seven eight nine ten/;
sub _to_string {
my ($self) = @_;
return $stringified[$$self];
}
sub _get {
my ($self) = @_;
return $$self;
}
package TieStringifiableInteger;
sub TIESCALAR {
my ($class) = @_;
my $integer = StringifiableInteger->new;
bless \$integer, $class;
}
sub STORE {
my ($self, $value) = @_;
$$self->set($value);
}
sub FETCH {
my ($self) = @_;
return $$self;
}
package AttributeStringifiableInteger;
use Attribute::Handlers;
sub UNIVERSAL::StringifiableInteger : ATTR(SCALAR) {
my ($referent) = @_[2..2];
tie $$referent, 'TieStringifiableInteger';
}
1;
####
use Attribute::StringifiableInteger lang => 'tr';
####
my $integer : StringifiableInteger('tr');