our
$VERSION
=
'1.102'
;
Scalar::Util->can(
"looks_like_number"
) and Scalar::Util->
import
(
"looks_like_number"
);
Params::Util::PP->can(
"looks_like_number"
) or
*looks_like_number
=
sub
{
local
$_
=
shift
;
return
0
if
!
defined
(
$_
);
if
(
ref
(
$_
))
{
return
overload::Overloaded(
$_
) ?
defined
(0 +
$_
) : 0;
}
return
1
if
(/^[+-]?[0-9]+$/);
return
1
if
(/^(?:[+-]?)(?=[0-9]|\.[0-9])[0-9]*(?:\.[0-9]*)?(?:[Ee](?:[+-]?[0-9]+))?$/);
return
1
if
($] >= 5.008 and /^(?:Inf(?:inity)?|NaN)$/i) or ($] >= 5.006001 and /^Inf$/i);
0;
};
sub
_XScompiled {
return
0; }
sub
_STRING ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and
length
(
$arg
)) ?
$arg
:
undef
;
}
sub
_IDENTIFIER ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and
$arg
=~ m/^[^\W\d]\w*\z/s) ?
$arg
:
undef
;
}
sub
_CLASS ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and
$arg
=~ m/^[^\W\d]\w*(?:::\w+)*\z/s) ?
$arg
:
undef
;
}
sub
_CLASSISA ($$)
{
return
(
defined
$_
[0] and not
ref
$_
[0] and
$_
[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and
$_
[0]->isa(
$_
[1])) ?
$_
[0] :
undef
;
}
sub
_CLASSDOES ($$)
{
return
(
defined
$_
[0] and not
ref
$_
[0] and
$_
[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and
$_
[0]->DOES(
$_
[1])) ?
$_
[0] :
undef
;
}
sub
_SUBCLASS ($$)
{
return
(
defined
$_
[0] and not
ref
$_
[0] and
$_
[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s and
$_
[0] ne
$_
[1] and
$_
[0]->isa(
$_
[1]))
?
$_
[0]
:
undef
;
}
sub
_NUMBER ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and looks_like_number(
$arg
)) ?
$arg
:
undef
;
}
sub
_POSINT ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and
$arg
=~ m/^[1-9]\d*$/) ?
$arg
:
undef
;
}
sub
_NONNEGINT ($)
{
my
$arg
=
$_
[0];
return
(
defined
$arg
and not
ref
$arg
and
$arg
=~ m/^(?:0|[1-9]\d*)$/) ?
$arg
:
undef
;
}
sub
_SCALAR ($)
{
return
(
ref
$_
[0] eq
'SCALAR'
and
defined
${
$_
[0]} and ${
$_
[0]} ne
''
) ?
$_
[0] :
undef
;
}
sub
_SCALAR0 ($)
{
return
ref
$_
[0] eq
'SCALAR'
?
$_
[0] :
undef
;
}
sub
_ARRAY ($)
{
return
(
ref
$_
[0] eq
'ARRAY'
and @{
$_
[0]}) ?
$_
[0] :
undef
;
}
sub
_ARRAY0 ($)
{
return
ref
$_
[0] eq
'ARRAY'
?
$_
[0] :
undef
;
}
sub
_ARRAYLIKE
{
return
(
defined
$_
[0] and
ref
$_
[0] and ((Scalar::Util::reftype(
$_
[0]) eq
'ARRAY'
)
or overload::Method(
$_
[0],
'@{}'
))
) ?
$_
[0] :
undef
;
}
sub
_HASH ($)
{
return
(
ref
$_
[0] eq
'HASH'
and
scalar
%{
$_
[0]}) ?
$_
[0] :
undef
;
}
sub
_HASH0 ($)
{
return
ref
$_
[0] eq
'HASH'
?
$_
[0] :
undef
;
}
sub
_HASHLIKE
{
return
(
defined
$_
[0] and
ref
$_
[0] and ((Scalar::Util::reftype(
$_
[0]) eq
'HASH'
)
or overload::Method(
$_
[0],
'%{}'
))
) ?
$_
[0] :
undef
;
}
sub
_CODE ($)
{
return
ref
$_
[0] eq
'CODE'
?
$_
[0] :
undef
;
}
sub
_CODELIKE($)
{
return
(
(Scalar::Util::reftype(
$_
[0]) ||
''
) eq
'CODE'
or Scalar::Util::blessed(
$_
[0]) and overload::Method(
$_
[0],
'&{}'
)
) ?
$_
[0] :
undef
;
}
sub
_INVOCANT($)
{
return
(
defined
$_
[0]
and (
defined
Scalar::Util::blessed(
$_
[0])
or
_CLASS(
$_
[0])
)
) ?
$_
[0] :
undef
;
}
sub
_INSTANCE ($$)
{
return
(Scalar::Util::blessed(
$_
[0]) and
$_
[0]->isa(
$_
[1])) ?
$_
[0] :
undef
;
}
sub
_INSTANCEDOES ($$)
{
return
(Scalar::Util::blessed(
$_
[0]) and
$_
[0]->DOES(
$_
[1])) ?
$_
[0] :
undef
;
}
sub
_REGEX ($)
{
return
(
defined
$_
[0] and
'Regexp'
eq
ref
(
$_
[0])) ?
$_
[0] :
undef
;
}
sub
_SET ($$)
{
my
$set_param
=
shift
;
_ARRAY(
$set_param
) or
return
undef
;
foreach
my
$item
(
@$set_param
)
{
_INSTANCE(
$item
,
$_
[0]) or
return
undef
;
}
return
$set_param
;
}
sub
_SET0 ($$)
{
my
$set_param
=
shift
;
_ARRAY0(
$set_param
) or
return
undef
;
foreach
my
$item
(
@$set_param
)
{
_INSTANCE(
$item
,
$_
[0]) or
return
undef
;
}
return
$set_param
;
}
sub
_HANDLE
{
my
$it
=
shift
;
unless
(
defined
$it
)
{
return
undef
;
}
if
(
ref
$it
eq
'GLOB'
)
{
return
$it
;
}
if
(
tied
(
$it
) and
tied
(
$it
)->can(
'TIEHANDLE'
))
{
return
$it
;
}
unless
(Scalar::Util::blessed(
$it
))
{
return
undef
;
}
if
(
$it
->isa(
'IO::Handle'
))
{
return
$it
;
}
if
(
$it
->isa(
'Tie::Handle'
))
{
return
$it
;
}
if
(
$it
->isa(
'IO::Scalar'
))
{
return
$it
;
}
if
(
$it
->isa(
'IO::String'
))
{
return
$it
;
}
return
undef
;
}
sub
_DRIVER ($$)
{
return
(
defined
_CLASS(
$_
[0]) and
eval
"require $_[0];"
and not $@ and
$_
[0]->isa(
$_
[1]) and
$_
[0] ne
$_
[1]) ?
$_
[0] :
undef
;
}
1;