{
our
$VERSION
=
'0.32'
; }
our
@EXPORT_OK
=
qw< writer reader embed embedded generate_module_from_file reassemble >
;
our
@EXPORT
= ();
our
%EXPORT_TAGS
= (
all
=> \
@EXPORT_OK
,
reading
=> [
qw< reader embedded >
],
writing
=> [
qw< writer embed generate_module_from_file reassemble >
],
);
sub
writer {
return
Data::Embed::Writer->new(
@_
);
}
sub
reader {
return
Data::Embed::Reader->new(
@_
);
}
sub
embed {
my
%args
= (
@_
&&
ref
(
$_
[0])) ? %{
$_
[0]} :
@_
;
my
%constructor_args
=
map
{
$_
=>
delete
$args
{
$_
} }
qw< input output >
;
$constructor_args
{input} =
$constructor_args
{output} =
delete
$args
{container}
if
exists
$args
{container};
my
$writer
= writer(
%constructor_args
)
or LOGCROAK
'could not get the writer object'
;
return
$writer
->add(
%args
);
}
sub
embedded {
my
$reader
= reader(
shift
)
or LOGCROAK
'could not get the writer object'
;
return
$reader
->files();
}
sub
generate_module_from_file {
goto
&Data::Embed::OneFileAsModule::generate_module_from_file
;
}
sub
__compare_and_shift {
my
(
$l1
,
$l2
) =
@_
;
while
(
scalar
(
@$l1
) &&
scalar
(
@$l2
)) {
last
unless
$l1
->[0]->is_same_as(
$l2
->[0]);
shift
@$l1
;
shift
@$l2
;
}
return
(
$l1
,
$l2
);
}
sub
__temporary_for {
my
(
$target
,
$previous
) =
@_
;
my
$dir
= File::Basename::dirname
$target
;
my
$template
= File::Basename::basename(
$target
) .
'.tmp-XXXXXXX'
;
my
(
$fh
,
$filename
) = File::Temp::tempfile(
$template
,
DIR
=>
$dir
);
binmode
$fh
,
':raw'
;
my
$prefix
=
$previous
->prefix();
if
(
$prefix
->{
length
}) {
Data::Embed::Util::transfer(
$prefix
->fh(),
$fh
);
}
close
$fh
;
return
$filename
;
}
sub
reassemble {
my
%args
= (
@_
&&
ref
(
$_
[0])) ? %{
$_
[0]} :
@_
;
my
$target
=
$args
{target};
my
$interim_target
;
my
@sequence
= @{
$args
{sequence} || []};
my
$writer
;
if
(
ref
(
$target
) eq
'SCALAR'
|| (-e
$target
)) {
my
$previous
= reader(
$target
);
my
(
$rprevious
,
$rsequence
) =
__compare_and_shift([
$previous
->files()], [
@sequence
]);
my
$nprevious
=
scalar
@$rprevious
;
my
$nsequence
=
scalar
@$rsequence
;
return
unless
$nprevious
||
$nsequence
;
if
(
(
$nprevious
&&
$nsequence
)
||
$nprevious
)
{
if
(
ref
$target
) {
$interim_target
=
$previous
->prefix()->contents();
$writer
= writer(
input
=> \
$interim_target
,
output
=> \
$interim_target
,
);
}
else
{
$interim_target
= __temporary_for(
$target
,
$previous
);
$writer
= writer(
input
=>
$interim_target
,
output
=>
$interim_target
,
);
}
}
elsif
(
$nprevious
) {
}
else
{
@sequence
=
@$rsequence
;
$writer
= writer(
output
=>
$target
,
input
=>
$target
);
}
}
else
{
$writer
= writer(
output
=>
$target
);
}
$writer
->add(
inputs
=> [
map
{
if
(blessed(
$_
) &&
$_
->isa(
'Data::Embed::File'
)) {
{
name
=>
$_
->name(),
fh
=>
$_
->fh(),
};
}
else
{
$_
;
}
}
@sequence
]
);
$writer
->write_index();
if
(
defined
$interim_target
) {
if
(
ref
$target
) {
$$target
=
$interim_target
;
}
else
{
rename
$interim_target
,
$target
;
}
}
return
;
}
1;