no
warnings
'redefine'
;
sub
generate_OVERLOAD :Sub(Private)
{
my
(
$GBL
) =
@_
;
my
%TYPE
= (
'STRINGIFY'
=>
q/""/
,
'NUMERIFY'
=>
q/0+/
,
'BOOLIFY'
=>
q/bool/
,
'ARRAYIFY'
=>
q/@{}/
,
'HASHIFY'
=>
q/%{}/
,
'GLOBIFY'
=>
q/*{}/
,
'CODIFY'
=>
q/&{}/
,
);
my
(
%code
,
$code
,
%meta
);
while
(
my
$info
=
shift
(@{
$$GBL
{
'sub'
}{
'ol'
}})) {
$$info
{
'name'
} ||= sub_name(
$$info
{
'code'
},
":$$info{'ify'}"
,
$$info
{
'loc'
});
my
$pkg
=
$$info
{
'pkg'
};
my
$name
=
$$info
{
'name'
};
push
(@{
$code
{
$pkg
}},
"\tq/$TYPE{$$info{'ify'}}/ => sub { \$_[0]->$name() },"
);
$meta
{
$pkg
}{
$name
}{
'kind'
} =
'overload'
;
}
delete
(
$$GBL
{
'sub'
}{
'ol'
});
foreach
my
$pkg
(
keys
(
%code
)) {
$code
.=
"package $pkg;\nuse overload (\n"
.
join
(
"\n"
, @{
$code
{
$pkg
}}) .
"\n\t'fallback' => 1);\n"
;
}
my
@errs
;
local
$SIG
{
'__WARN__'
} =
sub
{
push
(
@errs
,
@_
); };
eval
$code
;
if
($@ ||
@errs
) {
my
(
$err
) =
split
(/ at /, $@ ||
join
(
" | "
,
@errs
));
OIO::Internal->
die
(
'message'
=>
"Failure creating overloads"
,
'Error'
=>
$err
,
'Code'
=>
$code
,
'self'
=> 1);
}
add_meta(\
%meta
);
no
strict
'refs'
;
foreach
my
$pkg
(
keys
(%{
$$GBL
{
'tree'
}{
'td'
}})) {
bless
(\
do
{
my
$scalar
; },
$pkg
);
if
(
exists
(${
$pkg
.
'::'
}{
'(${}'
})) {
(
my
$file
=
$pkg
.
'.pm'
) =~ s/::/\//g;
OIO::Code->
die
(
'location'
=> [
$pkg
,
$INC
{
$file
} ||
''
,
''
],
'message'
=>
q/Overloading scalar dereferencing '${}' is not allowed/
,
'Info'
=>
q/The scalar of an object is its object ID, and can't be redefined/
);
}
}
}
}
my
$VERSION
= 3.09;
(
$Object::InsideOut::VERSION
== 3.09) or
die
(
"Version mismatch\n"
);