@EXPORT_OK
= (
qw< generate_module_from_file >
);
@EXPORT
= ();
%EXPORT_TAGS
= (
all
=> \
@EXPORT_OK
);
our
$VERSION
=
'0.32'
;
{
no
strict
'refs'
;
{
my
$data
= \*{__PACKAGE__ .
'::DATA'
};
my
$position
=
undef
;
sub
get_fh {
$position
=
tell
$data
unless
defined
$position
;
open
my
$fh
,
'<&'
,
$data
or croak __PACKAGE__ .
"::dup() for DATA: $OS_ERROR"
;
seek
$fh
,
$position
, SEEK_SET;
return
$fh
;
}
sub
get_data {
my
$fh
= get_fh();
binmode
$fh
;
local
$/ =
wantarray
() ? $/ :
undef
;
return
<
$fh
>;
}
}
}
sub
_get_output_fh {
my
$output
=
shift
;
my
$binmode
=
shift
||
':raw'
;
if
(!
defined
$output
) {
my
$buffer
=
''
;
open
my
$fh
,
'>'
, \
$buffer
or LOGCROAK
"open() on (scalar ref): $OS_ERROR"
;
binmode
$fh
,
$binmode
;
return
(
$fh
, \
$buffer
);
}
if
(
$output
eq
'-'
) {
open
my
$fh
,
'>&'
, \
*STDOUT
or LOGCROAK
"dup(): $OS_ERROR"
;
binmode
$fh
,
$binmode
;
return
$fh
;
}
my
$ro
=
ref
$output
;
if
(!
$ro
) {
open
my
$fh
,
'>'
,
$output
or LOGCROAK
"open('$output'): $OS_ERROR"
;
binmode
$fh
,
$binmode
;
return
$fh
;
}
return
$output
if
$ro
ne
'SCALAR'
;
open
my
$fh
,
'>'
,
$output
or LOGCROAK
"open('$output') (scalar ref): $OS_ERROR"
;
binmode
$fh
,
$binmode
;
return
$fh
;
}
sub
_get_input_fh {
my
$args
=
shift
;
return
$args
->{fh}
if
exists
$args
->{fh};
if
(
defined
$args
->{filename}) {
open
my
$fh
,
'<'
,
$args
->{filename}
or LOGCROAK
"open('$args->{filename}'): $OS_ERROR"
;
binmode
$fh
;
return
$fh
;
}
if
(
defined
$args
->{dataref}) {
open
my
$fh
,
'<'
,
$args
->{dataref}
or LOGCROAK
"open('$args->{dataref}') (scalar ref): $OS_ERROR"
;
binmode
$fh
;
return
$fh
;
}
if
(
defined
$args
->{data}) {
open
my
$fh
,
'<'
, \
$args
->{data}
or LOGCROAK
"open() (scalar ref): $OS_ERROR"
;
binmode
$fh
;
return
$fh
;
}
LOGCROAK
"no input source defined"
;
return
;
}
sub
generate_module_from_file {
my
%args
= (
scalar
(
@_
) &&
ref
(
$_
[0])) ? %{
$_
[0]} :
@_
;
LOGCROAK
'no package name set'
unless
defined
$args
{
package
};
LOGCROAK
"unsupported package name '$args{module}'"
unless
$args
{
package
} =~ m{\A (?: \w+) (:: \w+)* \z}mxs;
my
$template_fh
= get_fh();
binmode
$template_fh
;
seek
$template_fh
, 0, SEEK_SET;
my
$in_fh
= _get_input_fh(\
%args
);
(
$args
{output} =
'lib/'
.
$args
{
package
} .
'.pm'
) =~ s{::}{/}gmxs
if
$args
{output_from_package};
my
(
$out_fh
,
$outref
) = _get_output_fh(
$args
{output},
$args
{
binmode
});
print
{
$out_fh
}
"package $args{package};\n"
;
my
$seen_start
;
INPUT:
while
(<
$template_fh
>) {
if
(!
$seen_start
) {
$seen_start
= m{\A \
next
INPUT;
}
last
INPUT
if
m{\A \
print
{
$out_fh
}
$_
;
}
print
{
$out_fh
}
"\n1;\n__DATA__\n"
;
while
(!
eof
$in_fh
) {
defined
(
my
$nread
=
read
$in_fh
,
my
$buffer
, 4096)
or LOGCROAK
"read(): $OS_ERROR"
;
last
unless
$nread
;
print
{
$out_fh
}
$buffer
;
}
return
$$outref
if
$outref
;
return
;
}
1;