#!/usr/bin/env perl use strict; use warnings; use Test::More tests => 60; sub INTEGER::inc { $_[0] + 1 } sub FLOAT::inc { $_[0] + 1 } sub STRING::inc { my $string = shift; ++$string } sub NUMBER::inc { $_[0] + 1 } sub SCALAR::inc { my $scalar = shift; ++$scalar } my $integer = 42; my $float = 3.1415927; my $string = 'Hello'; my $einc = qr{Can't call method "inc" without a package or object reference\b}; my $einc2 = qr{Can't locate object method "inc" via package "Hello"}; { use autobox INTEGER => 'INTEGER'; is (42->inc, 43, '42->inc'); is ($integer->inc, 43, '$integer->inc'); # make sure it doesn't work for other scalars eval { 42.0->inc }; like ($@, $einc, '42.0->inc'); eval { $float->inc }; like ($@, $einc, '$float->inc'); eval { "Hello"->inc }; like ($@, $einc2, '"Hello"->inc'); eval { $string->inc }; like ($@, $einc2, '$string->inc'); } { use autobox FLOAT => 'FLOAT'; is (3.1415927->inc, 4.1415927, '3.1415927->inc'); is ($float->inc, 4.1415927, '$float->inc'); eval { 42->inc }; like ($@, $einc, '42->inc'); eval { $integer->inc }; like ($@, $einc, '$integer->inc'); eval { "Hello"->inc }; like ($@, $einc2, '"Hello"->inc'); eval { $string->inc }; like ($@, $einc2, '$string->inc'); } { use autobox STRING => 'STRING'; is ("Hello"->inc, "Hellp", '"Hello"->inc'); is ($string->inc, "Hellp", '$string->inc'); eval { 42->inc }; like ($@, $einc, '42->inc'); eval { $integer->inc }; like ($@, $einc, '$integer->inc'); eval { 42.0->inc }; like ($@, $einc, '42.0->inc'); eval { $float->inc }; like ($@, $einc, '$float->inc'); } { use autobox NUMBER => 'NUMBER'; is (42->inc, 43, '42->inc'); is ($integer->inc, 43, '$integer->inc'); is (3.1415927->inc, 4.1415927, '3.1415927->inc'); is ($float->inc, 4.1415927, '$float->inc'); eval { "Hello"->inc }; like ($@, $einc2, '"Hello"->inc'); eval { $string->inc }; like ($@, $einc2, '$string->inc'); } { use autobox SCALAR => 'SCALAR'; is (42->inc, 43, '42->inc'); is ($integer->inc, 43, '$integer->inc'); is (3.1415927->inc, 4.1415927, '3.1415927->inc'); is ($float->inc, 4.1415927, '$float->inc'); is ("Hello"->inc, "Hellp", '"Hello"->inc'); is ($string->inc, "Hellp", '$string->inc'); } # unimport should delete subtypes added automatically { use autobox SCALAR => 'SCALAR'; no autobox qw(INTEGER); eval { 42->inc }; like ($@, $einc, '42->inc'); eval { $integer->inc }; like ($@, $einc, '$integer->inc'); is (3.1415927->inc, 4.1415927, '3.1415927->inc'); is ($float->inc, 4.1415927, '$float->inc'); is ("Hello"->inc, "Hellp", '"Hello"->inc'); is ($string->inc, "Hellp", '$string->inc'); } { use autobox SCALAR => 'SCALAR'; no autobox qw(FLOAT); eval { 42.0->inc }; like ($@, $einc, '42.0->inc'); eval { $float->inc }; like ($@, $einc, '$float->inc'); is (42->inc, 43, '42->inc'); is ($integer->inc, 43, '$integer->inc'); is ("Hello"->inc, "Hellp", '"Hello"->inc'); is ($string->inc, "Hellp", '$string->inc'); } { use autobox SCALAR => 'SCALAR'; no autobox qw(STRING); eval { "Hello"->inc }; like ($@, $einc2, '"Hello"->inc'); eval { $string->inc }; like ($@, $einc2, '$string->inc'); is (42->inc, 43, '42->inc'); is ($integer->inc, 43, '$integer->inc'); is (3.1415927->inc, 4.1415927, '3.1415927->inc'); is ($float->inc, 4.1415927, '$float->inc'); } { use autobox SCALAR => 'SCALAR'; no autobox qw(NUMBER); eval { 42->inc }; like ($@, $einc, '42->inc'); eval { $integer->inc }; like ($@, $einc, '$integer->inc'); eval { 42.0->inc }; like ($@, $einc, '42.0->inc'); eval { $float->inc }; like ($@, $einc, '$float->inc'); is ("Hello"->inc, "Hellp", '"Hello"->inc'); is ($string->inc, "Hellp", '$string->inc'); } { use autobox SCALAR => 'SCALAR'; no autobox qw(SCALAR); eval { 42->inc }; like ($@, $einc, '42->inc'); eval { $integer->inc }; like ($@, $einc, '$integer->inc'); eval { 42.0->inc }; like ($@, $einc, '42.0->inc'); eval { $float->inc }; like ($@, $einc, '$float->inc'); eval { "Hello"->inc }; like ($@, $einc2, '"Hello"->inc'); eval { $string->inc }; like ($@, $einc2, '$string->inc'); }