#!./perl
BEGIN {
chdir
't'
if
-d
't'
;
@INC
=
'../lib'
;
}
our
@ISA
=
qw( Tie::Scalar )
;
sub
new {
'Fooled you.'
}
our
$flag
;
use_ok(
'Tie::Scalar'
);
for
my
$method
(
qw( TIESCALAR FETCH STORE )
) {
eval
{ Tie::Scalar->
$method
() };
like( $@,
qr/doesn't define a $method/
,
"croaks on inherited $method()"
);
}
my
$scalar
= Tie::StdScalar->TIESCALAR();
is(
$$scalar
,
undef
,
'used TIESCALAR, default value is still undef'
);
$scalar
= Tie::StdScalar->new();
is(
$$scalar
,
undef
,
'used new(), default value is still undef'
);
tie
$scalar
,
'Tie::StdScalar'
;
is(
$$scalar
,
undef
,
'tied a scalar, default value is undef'
);
$scalar
=
'fetch me'
;
is(
$scalar
,
'fetch me'
,
'STORE() and FETCH() verified with one test!'
);
{
my
$scalar
=
'foo'
;
tie
$scalar
,
'Tie::StdScalar'
, DestroyAction->new();
ok(
$scalar
,
'tied once more'
);
is(
$flag
,
undef
,
'destroy flag not set'
);
}
is(
$flag
, 1,
'and DESTROY() works'
);
my
$warn
;
local
$SIG
{__WARN__} =
sub
{
$warn
=
$_
[0];
};
is(
tie
(
my
$foo
,
'TieTest'
),
'Fooled you.'
,
'delegated to new()'
);
like(
$warn
,
qr/WARNING: calling TieTest->new/
,
'caught warning fine'
);
sub
new {
bless
( \(
my
$self
),
$_
[0] );
}
sub
DESTROY {
$main::flag
= 1;
}
@NoMethods::ISA
=
qw [Tie::Scalar];
{
local
$SIG
{__WARN__} =
sub
{
die
"Called NoMethods->new"
if
$_
[0] =~ /^WARNING: calling NoMethods->new/;
};
eval
{
tie
my
$foo
=>
"NoMethods"
;};
like $@ =>
qr /\QNoMethods
must define either a TIESCALAR() or a new() method/,
"croaks if both new() and TIESCALAR() are missing"
;
};
my
$called1
= 0;
my
$called2
= 0;
sub
HasMethod1::new {
$called1
++}
@HasMethod1::ISA
=
qw [Tie::Scalar];
@InheritHasMethod1::ISA
=
qw [HasMethod1];
sub
HasMethod2::TIESCALAR {
$called2
++}
@HasMethod2::ISA
=
qw [Tie::Scalar];
@InheritHasMethod2::ISA
=
qw [HasMethod2];
my
$r1
=
eval
{
tie
my
$foo
=>
"InheritHasMethod1"
; 1};
my
$r2
=
eval
{
tie
my
$foo
=>
"InheritHasMethod2"
; 1};
ok
$r1
&&
$called1
,
"inheriting new() does not croak"
;
ok
$r2
&&
$called2
,
"inheriting TIESCALAR() does not croak"
;
done_testing();