summaryrefslogtreecommitdiff
path: root/lib/Tie/Scalar.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Tie/Scalar.pm')
-rw-r--r--lib/Tie/Scalar.pm17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/Tie/Scalar.pm b/lib/Tie/Scalar.pm
index 8048569729..329770a6a2 100644
--- a/lib/Tie/Scalar.pm
+++ b/lib/Tie/Scalar.pm
@@ -104,9 +104,20 @@ sub new {
sub TIESCALAR {
my $pkg = shift;
- if ($pkg->can('new') and $pkg ne __PACKAGE__) {
- warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing");
- $pkg->new(@_);
+ my $pkg_new = $pkg -> can ('new');
+
+ if ($pkg_new and $pkg ne __PACKAGE__) {
+ my $my_new = __PACKAGE__ -> can ('new');
+ if ($pkg_new == $my_new) {
+ #
+ # Prevent recursion
+ #
+ croak "$pkg must define either a TIESCALAR() or a new() method";
+ }
+
+ warnings::warnif ("WARNING: calling ${pkg}->new since " .
+ "${pkg}->TIESCALAR is missing");
+ $pkg -> new (@_);
}
else {
croak "$pkg doesn't define a TIESCALAR method";