BEGIN
{
use
vars
qw( $true $false )
;
"0+"
=>
sub
{ ${
$_
[0]} },
"++"
=>
sub
{
$_
[0] = ${
$_
[0]} + 1 },
"--"
=>
sub
{
$_
[0] = ${
$_
[0]} - 1 },
fallback
=> 1;
$true
=
do
{
bless
( \(
my
$dummy
= 1 ) =>
'Module::Generic::Boolean'
) };
$false
=
do
{
bless
( \(
my
$dummy
= 0 ) =>
'Module::Generic::Boolean'
) };
use
constant
HAS_THREADS
=> (
$Config
{useithreads} &&
$INC
{
'threads.pm'
} );
if
( HAS_THREADS )
{
threads->
import
();
threads::shared->
import
();
}
our
(
$VERSION
) =
'v1.2.1'
;
};
sub
new {
return
(
$_
[1] ?
$true
:
$false
); }
sub
as_array
{
state
$loaded
;
if
( HAS_THREADS && !
$loaded
)
{
lock
(
$loaded
);
$loaded
= 1;
}
elsif
( !
$loaded
)
{
$loaded
= 1;
}
return
( Module::Generic::Array->new( [ ${
$_
[0]} ] ) );
}
sub
as_number
{
state
$loaded
;
if
( HAS_THREADS && !
$loaded
)
{
lock
(
$loaded
);
$loaded
= 1;
}
elsif
( !
$loaded
)
{
$loaded
= 1;
}
return
( Module::Generic::Number->new( ${
$_
[0]} ) );
}
sub
as_scalar
{
state
$loaded
;
if
( HAS_THREADS && !
$loaded
)
{
lock
(
$loaded
);
$loaded
= 1;
}
elsif
( !
$loaded
)
{
$loaded
= 1;
}
return
( Module::Generic::Scalar->new( ${
$_
[0]} ) );
}
sub
defined
{
return
(1); }
sub
true () {
$true
}
sub
false () {
$false
}
sub
is_bool ($) { UNIVERSAL::isa(
$_
[0],
'Module::Generic::Boolean'
) }
sub
is_true ($) {
$_
[0] && UNIVERSAL::isa(
$_
[0],
'Module::Generic::Boolean'
) }
sub
is_false ($) { !
$_
[0] && UNIVERSAL::isa(
$_
[0],
'Module::Generic::Boolean'
) }
sub
FREEZE
{
my
$self
= CORE::
shift
(
@_
);
my
$serialiser
= CORE::
shift
(
@_
) //
''
;
my
$class
= CORE::
ref
(
$self
);
CORE::
return
( [
$class
,
$$self
] )
if
(
$serialiser
eq
'Sereal'
&& Sereal::Encoder->VERSION <= version->parse(
'4.023'
) );
CORE::
return
(
$$self
);
}
sub
STORABLE_freeze { CORE::
return
( CORE::
shift
->FREEZE(
@_
) ); }
sub
STORABLE_thaw { CORE::
return
( CORE::
shift
->THAW(
@_
) ); }
sub
THAW
{
my
(
$self
,
undef
,
@args
) =
@_
;
my
(
$class
,
$str
);
if
( CORE::
scalar
(
@args
) == 1 && CORE::
ref
(
$args
[0] ) eq
'ARRAY'
)
{
(
$class
,
$str
) = @{
$args
[0]};
}
else
{
$class
= CORE::
ref
(
$self
) ||
$self
;
$str
= CORE::
shift
(
@args
);
}
if
( CORE::
ref
(
$self
) )
{
$$self
=
$str
;
CORE::
return
(
$self
);
}
else
{
CORE::
return
(
$class
->new(
$str
) );
}
}
sub
TO_JSON
{
return
(
$_
[0] ? \1 : \0 );
}
1;