#!./perl BEGIN { chdir 't' if -d 't'; @INC = '../lib'; } # this must come before main, or tests will fail package TieTest; use Tie::Scalar; use vars qw( @ISA ); @ISA = qw( Tie::Scalar ); sub new { 'Fooled you.' } package main; use vars qw( $flag ); use Test::More tests => 13; use_ok( 'Tie::Scalar' ); # these are "abstract virtual" parent methods for my $method qw( TIESCALAR FETCH STORE ) { eval { Tie::Scalar->$method() }; like( $@, qr/doesn't define a $method/, "croaks on inherited $method()" ); } # the default value is undef my $scalar = Tie::StdScalar->TIESCALAR(); is( $$scalar, undef, 'used TIESCALAR, default value is still undef' ); # Tie::StdScalar redirects to TIESCALAR $scalar = Tie::StdScalar->new(); is( $$scalar, undef, 'used new(), default value is still undef' ); # this approach should work as well tie $scalar, 'Tie::StdScalar'; is( $$scalar, undef, 'tied a scalar, default value is undef' ); # first set, then read $scalar = 'fetch me'; is( $scalar, 'fetch me', 'STORE() and FETCH() verified with one test!' ); # test DESTROY with an object that signals its destruction { my $scalar = 'foo'; tie $scalar, 'Tie::StdScalar', DestroyAction->new(); ok( $scalar, 'tied once more' ); is( $flag, undef, 'destroy flag not set' ); } # $scalar out of scope, Tie::StdScalar::DESTROY() called, DestroyAction set flag is( $flag, 1, 'and DESTROY() works' ); # we want some noise, and some way to capture it use warnings; my $warn; local $SIG{__WARN__} = sub { $warn = $_[0]; }; # Tie::Scalar::TIEHANDLE should find and call TieTest::new and complain is( tie( my $foo, 'TieTest'), 'Fooled you.', 'delegated to new()' ); like( $warn, qr/WARNING: calling TieTest->new/, 'caught warning fine' ); package DestroyAction; sub new { bless( \(my $self), $_[0] ); } sub DESTROY { $main::flag = 1; }