diff --git a/bin/pt-archiver b/bin/pt-archiver index be2a7d4e..01e42a22 100755 --- a/bin/pt-archiver +++ b/bin/pt-archiver @@ -1104,14 +1104,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1285,7 +1286,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-deadlock-logger b/bin/pt-deadlock-logger index b5a35c53..864eb94a 100755 --- a/bin/pt-deadlock-logger +++ b/bin/pt-deadlock-logger @@ -1101,14 +1101,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1282,7 +1283,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-kill b/bin/pt-kill index d6cc6ccb..72c9f3f8 100755 --- a/bin/pt-kill +++ b/bin/pt-kill @@ -1108,14 +1108,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1289,7 +1290,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index de3bd493..a1170a48 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -1114,14 +1114,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1295,7 +1296,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-slave-delay b/bin/pt-slave-delay index 09fe421f..c67d286f 100755 --- a/bin/pt-slave-delay +++ b/bin/pt-slave-delay @@ -1101,14 +1101,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1282,7 +1283,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-slave-find b/bin/pt-slave-find index 847f87f2..12013bed 100755 --- a/bin/pt-slave-find +++ b/bin/pt-slave-find @@ -1080,14 +1080,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1261,7 +1262,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-slave-restart b/bin/pt-slave-restart index e8edcc6a..bbfb40f6 100755 --- a/bin/pt-slave-restart +++ b/bin/pt-slave-restart @@ -1222,14 +1222,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1403,7 +1404,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index d0159e39..5f92d279 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -2774,14 +2774,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -2955,7 +2956,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/bin/pt-variable-advisor b/bin/pt-variable-advisor index b2e32e02..0d89b67a 100755 --- a/bin/pt-variable-advisor +++ b/bin/pt-variable-advisor @@ -1105,14 +1105,15 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, map { @@ -1286,7 +1287,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/lib/Mo.pm b/lib/Mo.pm index cbc5764e..ba96a512 100644 --- a/lib/Mo.pm +++ b/lib/Mo.pm @@ -41,19 +41,19 @@ use strict; use warnings qw( FATAL all ); use Carp (); -use Scalar::Util (); +use Scalar::Util qw(looks_like_number blessed); # Basic types for isa. If you want a new type, either add it here, # or give isa a coderef. + our %TYPES = ( - Bool => sub { !$_[0] || (defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == 1) }, - Num => sub { defined $_[0] && &Scalar::Util::looks_like_number }, - Int => sub { defined $_[0] && &Scalar::Util::looks_like_number && $_[0] == int $_[0] }, + Bool => sub { !$_[0] || (defined $_[0] && looks_like_number($_[0]) && $_[0] == 1) }, + Num => sub { defined $_[0] && looks_like_number($_[0]) }, + Int => sub { defined $_[0] && looks_like_number($_[0]) && $_[0] == int($_[0]) }, Str => sub { defined $_[0] }, - Object => sub { defined $_[0] && &Scalar::Util::blessed }, + Object => sub { defined $_[0] && blessed($_[0]) }, FileHandle => sub { local $@; require IO::Handle; fileno($_[0]) && $_[0]->opened }, - # Ref types: map { my $type = /R/ ? $_ : uc $_; $_ . "Ref" => sub { ref $_[0] eq $type } @@ -245,7 +245,7 @@ sub Mo::import { $method = sub { if ( $#_ ) { Carp::confess(qq) - unless blessed($_[1]) && $_[1]->does($role) + unless Scalar::Util::blessed($_[1]) && eval { $_[1]->does($role) } } goto &$original_method }; diff --git a/t/lib/Mo/isa.t b/t/lib/Mo/isa.t index 39e4e19c..426c2cb9 100644 --- a/t/lib/Mo/isa.t +++ b/t/lib/Mo/isa.t @@ -9,6 +9,7 @@ BEGIN { use strict; use warnings FATAL => 'all'; use English qw(-no_match_vars); +use PerconaTest (); use Test::More; sub dies_ok (&;$) { @@ -182,4 +183,19 @@ for my $type (@types[1..$#types]) { my $method = "my$type"; dies_ok { $foo->$method(undef) } "$type attr set to undef dies" } + +use Config; +use File::Spec; +use IPC::Cmd (); +my $thisperl = $^X; +if ($^O ne 'VMS') + {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;} + +my $pm_test = "$PerconaTest::trunk/t/lib/Mo/isa_subtest.pm"; + +ok( + scalar(IPC::Cmd::run(command => [$thisperl, $pm_test])), + "Mo types work with Scalar::Util::PP", +); + done_testing; diff --git a/t/lib/Mo/isa_subtest.pm b/t/lib/Mo/isa_subtest.pm new file mode 100644 index 00000000..1f331b93 --- /dev/null +++ b/t/lib/Mo/isa_subtest.pm @@ -0,0 +1,28 @@ +BEGIN { + require Scalar::Util::PP; + *Scalar::Util:: = \*Scalar::Util::PP::; + $INC{"Scalar/Util.pm"} = __FILE__; +}; + +BEGIN { + die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n" + unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH}; + unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib"; +}; + +use strict; +use warnings; + +{ + package isa_subtest; + use Mo; + + has attr => ( + is => 'rw', + isa => 'Int', + ); + + 1; +} + +isa_subtest->new(attr => 100);