$VERSION
=
do
{
my
@r
= (
q$Revision: 1.68 $
=~ /\d+/g);
sprintf
"%d."
.
"%02d"
x
$#r
,
@r
};
$|=1;
my
$o_Perlbug_Base
=
undef
;
my
$i_CNT
= 0;
my
$i_MAX
= 1;
my
$i_TOP
= 1;
sub
new {
my
$proto
=
shift
;
my
$class
=
ref
(
$proto
) ||
$proto
;
$o_Perlbug_Base
= (
ref
(
$_
[0])) ?
shift
: Perlbug::Base->new();
my
$self
= Perlbug::Object->new(
$o_Perlbug_Base
,
'name'
=>
'Format'
,
);
bless
(
$self
,
$class
);
}
sub
FORMAT {
my
$self
=
shift
;
my
$fmt
=
shift
||
$self
->base->current(
'format'
);
my
$h_data
=
shift
||
$self
->_oref(
'data'
);
my
$h_rel
=
shift
||
$self
->_oref(
'relation'
);
my
(
$format
,
$str
,
$target
,
$top
) = (
''
,
''
,
''
,
''
);
my
@args
= ();
my
$max
= 1000;
if
(
ref
(
$h_data
) ne
'HASH'
or
ref
(
$h_rel
) ne
'HASH'
) {
$self
->error(
"non-valid required args: data_href($h_data) and relations_href($h_rel)!"
);
}
else
{
my
$h_data
=
$self
->format_fields({%{
$h_data
}, %{
$h_rel
}},
$fmt
);
$target
=
'FORMAT_'
.
$fmt
;
(
$top
,
$format
,
@args
) =
$self
->
$target
(
$h_data
);
$^W = 0;
if
(
$fmt
=~ /[aAil]/o) {
$= = 1000;
$^A =
""
;
formline
(
$format
,
@args
);
}
else
{
$^A =
$format
;
}
$^W = 1;
$str
= ((
$i_TOP
== 1) ?
$top
.$^A : $^A);
if
(
$self
->base->current(
'context'
) eq
'http'
&&
$fmt
!~ /[hHIL]/) {
$str
= encode_entities(
$str
);
$str
=
'<pre>'
.
$str
.
'</pre>'
;
}
$self
->debug(3,
"str($str)"
)
if
$Perlbug::DEBUG
;
$self
->cnt(1);
$^A =
""
;
}
return
$str
;
}
sub
format_fields {
my
$self
=
shift
;
my
$h_ref
=
shift
;
my
$fmt
=
shift
||
'a'
;
my
$i_max
=
shift
|| 10;
my
$h_ret
= {};
if
(
ref
(
$h_ref
) ne
'HASH'
) {
$self
->error(
"requires a hash ref($h_ref)"
);
}
else
{
$self
->debug(2,
"normalising..."
);
my
$n_ref
=
$self
->normalize(
$h_ref
);
if
(
$fmt
!~ /[hHIL]/) {
$self
->debug(2,
"asciifying..."
);
$h_ret
=
$self
->asciify(
$n_ref
);
}
else
{
$self
->debug(2,
"htmlifying..."
);
$h_ret
=
$self
->htmlify(
$n_ref
);
$$h_ret
{
'select'
} =
' '
unless
$$h_ret
{
'select'
};
foreach
my
$k
(
sort
keys
%{
$h_ret
}) {
if
(
$k
=~ /body|entry|header|subject/io) {
$$h_ret
{
$k
} = encode_entities(
$$h_ret
{
$k
})
unless
$$h_ret
{
$k
} =~ /^\s*\
 
;\s*$/io;
$$h_ret
{
$k
} =
'<pre>'
.
$$h_ret
{
$k
}.
'</pre>'
unless
$k
eq
'subject'
;
}
}
}
}
$self
->debug(3,
"rjsf: fmt($fmt): "
.Dumper(
$h_ret
))
if
$Perlbug::DEBUG
;
return
$h_ret
;
}
sub
normalize {
my
$self
=
shift
;
my
$h_data
=
shift
;
my
%ret
= ();
if
(
ref
(
$h_data
) ne
'HASH'
) {
$self
->error(
"requires hashed data ref($h_data)!"
);
}
else
{
my
%args
= %{
$h_data
};
HASH:
foreach
my
$key
(
sort
keys
%args
) {
if
(
ref
(
$args
{
$key
}) ne
'HASH'
) {
$ret
{
$key
} =
$args
{
$key
};
}
else
{
my
%data
= %{
$args
{
$key
}};
foreach
my
$hkey
(
sort
keys
%data
) {
$ret
{
"${key}_$hkey"
} =
$data
{
$hkey
};
}
}
}
}
$self
->debug(3,
"$h_data => "
.Dumper(\
%ret
))
if
$Perlbug::DEBUG
;
return
\
%ret
;
}
sub
asciify {
my
$self
=
shift
;
my
$h_data
=
shift
;
my
%ret
= ();
if
(
ref
(
$h_data
) ne
'HASH'
) {
$self
->error(
"requires hashed data ref($h_data)!"
);
}
else
{
my
%args
= %{
$h_data
};
HASH:
foreach
my
$key
(
sort
keys
%args
) {
if
(
ref
(
$args
{
$key
}) ne
'ARRAY'
) {
$ret
{
$key
} =
$args
{
$key
} ||
'0'
;
}
else
{
if
(!(
scalar
(@{
$args
{
$key
}}) >= 1)) {
$ret
{
$key
} =
''
;
}
else
{
$ret
{
$key
} =
join
(
', '
, @{
$args
{
$key
}});
}
}
}
}
$self
->debug(3,
"$h_data => "
.Dumper(\
%ret
))
if
$Perlbug::DEBUG
;
return
\
%ret
;
}
sub
htmlify {
my
$self
=
shift
;
my
$h_data
=
shift
;
my
%ret
= ();
if
(
ref
(
$h_data
) ne
'HASH'
) {
$self
->error(
"requires hashed data ref($h_data)!"
);
}
else
{
my
%args
= %{
$h_data
};
foreach
my
$key
(
sort
keys
%args
) {
$ret
{
$key
} =
''
;
my
$val
=
$args
{
$key
} ||
''
;
if
(
ref
(
$val
) eq
'ARRAY'
) {
my
@args
= @{
$val
};
$self
->debug(3,
"\tmulti(@args)"
)
if
$Perlbug::DEBUG
;
if
(!(
scalar
(
@args
) >= 1)) {
$ret
{
$key
} =
' '
;
}
else
{
if
(
$key
!~ /^([a-z]+)_(ids|names)$/) {
$ret
{
$key
} =
join
(
' '
,
@args
);
}
else
{
my
(
$obj
,
$word
) = ($1, $2);
my
$o_obj
= (
$obj
=~ /(arent|hildren)/io) ?
$self
->object(
'bug'
) :
$self
->object(
$obj
);
my
$ident
= (
$word
eq
'names'
) ?
$o_obj
->identifier :
"${obj}_id"
;
if
(
$key
ne
'user_names'
) {
my
$stat_subj
= (
grep
(/^
$obj
$/,
$self
->base->objects(
'mail'
)))
?
$args
{
'subject'
}
:
''
;
$ret
{
$key
} =
join
(
', '
, (
$word
eq
'names'
)
?
map
{
$self
->href(
"${obj}_id"
, [
$o_obj
->name2id([
$_
])],
$_
,
$stat_subj
) }
@args
:
map
{
$self
->href(
"${obj}_id"
, [
$_
],
$_
,
$stat_subj
) }
@args
);
}
else
{
my
@usrs
= ();
foreach
my
$arg
(
sort
@args
) {
my
$stat_name
=
$arg
;
my
(
$uid
) =
$o_obj
->name2id([
$arg
]);
my
(
$name
) =
$self
->href(
"${obj}_id"
, [
$uid
],
$arg
,
$stat_name
);
my
(
$addr
) =
$o_obj
->
read
(
$uid
)->data(
'address'
);
my
$rec
=
qq|$name<a href="mailto:$addr">($addr)</a>|
;
push
(
@usrs
,
$rec
);
}
$ret
{
$key
} =
join
(
', <br>'
,
@usrs
);
}
}
}
}
else
{
$self
->debug(3,
"\tsingle($val)"
)
if
$Perlbug::DEBUG
;
if
(
$key
=~ /^([a-z]+)id$/io) {
my
$obj
= $1;
my
(
$hdrs
,
$status
) = (
''
,
''
);
if
(
grep
(/^
$obj
$/,
$self
->base->objects(
'mail'
))) {
(
$hdrs
) =
$self
->href(
"${obj}_header"
, [
$val
],
'headers<br>'
,
"Email headers"
);
$hdrs
=
''
unless
$hdrs
;
$status
=
$args
{
'subject'
};
}
$ret
{
$key
} =
join
(
' '
,
$self
->href(
"${obj}_id"
, [
$val
],
$val
,
$status
),
$hdrs
);
$self
->debug(2,
"obj($obj) val($val) -> ret($ret{$key})"
)
if
$Perlbug::DEBUG
;
}
elsif
(
$key
=~ /^([a-z]+)_count$/o) {
my
$obj
= $1;
my
$pointer
=
"${obj}_ids"
;
my
@ids
= (
ref
(
$args
{
$pointer
}) eq
'ARRAY'
) ? @{
$args
{
$pointer
}} : ();
my
$ids
= (
scalar
(
@ids
) >= 1) ?
join
(
"&${obj}_id="
,
@ids
) :
''
;
my
$i_ids
=
scalar
(
@ids
);
my
$stat_hdrs
=
"$i_ids ${obj}'s"
;
(
$ret
{
$key
}) =
$self
->href(
"${obj}_id"
, [
$ids
],
$i_ids
,
$stat_hdrs
);
}
elsif
(
$key
=~ /^(source|to)addr$/o) {
my
(
$addr
) =
$self
->parse_addrs([
$val
]);
$addr
=
''
unless
$addr
;
(
$ret
{
$key
}) = (
$addr
=~ /\w/o) ?
qq|<a href="mailto:$addr">$addr</a>|
:
''
;
}
else
{
$ret
{
$key
} = (
$key
eq
'name'
&&
$val
=~ /\w+\@\w+/o)
?
qq|<a href="mailto:$val">$val</a>|
:
"$val "
;
}
$ret
{
$key
} =
' '
unless
defined
(
$ret
{
$key
}) &&
$ret
{
$key
} =~ /\w/o;
}
$self
->debug(2,
"\tkey($key) -> ret($ret{$key})"
)
if
$Perlbug::DEBUG
;
}
}
$self
->debug(3,
"$h_data => "
.Dumper(\
%ret
))
if
$Perlbug::DEBUG
;
return
\
%ret
;
}
sub
parse_addrs {
my
$self
=
shift
;
my
$a_addrs
=
shift
;
my
$type
=
shift
||
'address'
;
my
@addrs
= (
ref
(
$a_addrs
) eq
'ARRAY'
) ? @{
$a_addrs
} : (
$a_addrs
);
my
%parsed
= ();
if
(
scalar
@addrs
>= 1) {
foreach
my
$addr
(
@addrs
) {
my
@o_addrs
= Mail::Address->parse(
$addr
);
foreach
my
$o_addr
(
@o_addrs
) {
if
(
ref
(
$o_addr
)) {
my
(
$addr
) =
$o_addr
->
$type
();
$parsed
{
$addr
}++;
}
}
}
}
$self
->debug(3,
"a_addrs($a_addrs), type($type) -> parsed("
.
join
(
', '
,
keys
%parsed
).
")"
)
if
$Perlbug::DEBUG
;
return
keys
%parsed
;
}
sub
href {
my
$self
=
shift
;
my
$key
=
shift
;
my
$a_items
=
shift
;
my
$visible
=
shift
||
''
;
my
$subject
=
shift
||
''
;
my
$a_bold
=
shift
||
''
;
my
@links
= ();
if
(
ref
(
$a_items
) ne
'ARRAY'
) {
$self
->error(
"requires array of items($a_items)"
);
}
else
{
my
$cgi
=
$self
->base->cgi;
my
$url
=
$self
->base->myurl;
my
$fmt
=
$self
->base->current(
'format'
);
my
$rid
=
$self
->base->{
'_range'
};
my
$range
= (
$rid
=~ /\w+/o) ?
"&range=$rid"
:
''
;
my
$trim
= (
ref
(
$cgi
) &&
$cgi
->can(
'trim'
) &&
$cgi
->param(
'trim'
) =~ /^(\d+)$/o) ? $1 : 25;
$subject
=~ s/'/\\\'/gos;
$subject
=~ s/"/\\\'/gos;
$subject
=~ s/\n+/ /gos;
my
$status
= (
$subject
=~ /\w+/o) ?
qq|onMouseOver="status='$subject'; return true;"|
:
''
;
if
(
$key
=~ /^\w+=\w+/o ||
scalar
(@{
$a_items
}) == 0 ) {
my
(
$format
) = (
$key
=~ /
format
/o) ?
''
:
'&format='
.(
$fmt
||
'H'
);
my
$link
=
qq|<a href=$url?req=${key}$format&trim=${trim}$range&target=perlbug $status>$visible</a>|
;
push
(
@links
,
$link
);
$self
->debug(3,
"singular($link)"
)
if
$Perlbug::DEBUG
;
}
else
{
my
$fmt
=
$fmt
||
'H'
;
ITEM:
foreach
my
$val
(@{
$a_items
}) {
next
ITEM
unless
defined
(
$val
) and
$val
=~ /\w+/o;
my
$vis
= (
$visible
=~ /\w+/o) ?
$visible
:
$val
;
my
$link
=
qq|<a href=$url?req=$key&$key=$val&format=$fmt&trim=${trim}$range&target=perlbug $status>$vis</a>|
;
push
(
@links
,
$link
);
$self
->debug(3,
"status($status), cgi($url), key($key), val($val), format($fmt), trim($trim), status($status), vis($vis) -> link($link)"
)
if
$Perlbug::DEBUG
;
}
}
}
return
wantarray
?
@links
:
$links
[0];
}
sub
mailto {
my
$self
=
shift
;
my
$h_tkt
=
shift
;
$self
->debug(3,
"mailto($h_tkt)"
)
if
$Perlbug::DEBUG
;
return
undef
unless
ref
(
$h_tkt
) eq
'HASH'
;
my
%tkt
= %{
$h_tkt
};
my
$subject
=
$tkt
{
'subject'
} ||
''
;
if
(
$subject
=~ /\w+/o) {
}
my
$reply
= (
$tkt
{
'osname'
} =~ /^(\w+)$/o) ?
$tkt
{
'osname'
} :
'generic'
;
my
$list
=
$self
->forward(
$reply
);
my
$mailto
=
qq|<a href="mailto:$list">reply</a>|
;
return
$mailto
;
}
sub
xpopup {
my
$self
=
shift
;
my
$flag
=
shift
;
my
$uqid
=
shift
;
my
$default
=
shift
||
''
;
my
$onchange
=
shift
||
''
;
my
$ok
= 1;
$self
->debug(3,
"popup: typeofflag($flag), uniqueid($uqid), default($default)"
)
if
$Perlbug::DEBUG
;
if
((
$flag
!~ /^\w+$/) || (
$uqid
!~ /\w+/)) {
$ok
= 0;
$self
->error(
"popup($flag, $uqid, [$default]) given invalid args!"
);
}
my
$cgi
=
$self
->cgi();
my
%flags
=
$self
->base->all_flags;
my
@flags
=
keys
%flags
;
if
(!
grep
(/^
$flag
$/,
@flags
)) {
$ok
= 0;
$self
->error(
"popup-flag($flag) not found amongst available flag types: '@flags'"
);
}
my
$popup
=
''
;
if
(
$ok
== 1) {
$self
->{
'popup'
}{
$flag
} =
''
;
my
@options
= (
''
,
sort
(
$self
->base->flags(
$flag
)));
$popup
=
$cgi
->popup_menu(
-
'name'
=>
$uqid
,
-
'values'
=> \
@options
,
-
'default'
=>
$default
);
$self
->{
'popup'
}{
$flag
} =
$popup
;
}
return
$self
->{
'popup'
}{
$flag
};
}
sub
FORMAT_ascii {
my
$self
=
shift
;
my
$data
=
shift
;
my
$key
=
ucfirst
(
$self
->attr(
'key'
));
my
@args
= (
values
%{
$data
},
'a'
..
'z'
, );
my
(
$top
,
$pre
,
$post
) = (
''
,
$$data
{
'_pre'
},
$$data
{
'_post'
});
my
$format
=
qq|
$key @{[ref($self)]} format:
-------------------------------------------------------------------------------
|
.((
'@'
.(
"<"
x 76).
"\n"
) x
scalar
(
@args
)).
qq|
|
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_html {
my
$self
=
shift
;
my
$href
=
shift
;
my
$key
=
ucfirst
(
$self
->attr(
'key'
));
my
@args
=
map
{
"$_<br>"
} (
values
%{
$href
},
'a'
..
'z'
);
my
$top
=
''
;
my
$format
=
qq|
<hr>
<h3>$key @{[ref($self)]} format:</h3>
<br>
|
.((
'@*'
.
"\n"
) x
scalar
(
@args
)).
qq|
|
;
return
(
$top
,
$format
,
@args
);
}
sub
max {
my
$self
=
shift
;
$i_MAX
=
shift
||
$i_MAX
;
return
$i_MAX
;
}
sub
cnt {
my
$self
=
shift
;
$i_CNT
+=
shift
|| 0;
if
(
$i_CNT
>=
$i_MAX
) {
$i_CNT
= 0;
$i_TOP
= 1;
}
else
{
$i_TOP
= 0;
}
return
$i_CNT
;
}
sub
FORMAT_i {
my
$self
=
shift
;
my
$x
=
shift
;
my
$pri
=
$self
->attr(
'primary_key'
);
my
@args
= (
$$x
{
$pri
} );
my
$top
=
''
;
my
$format
=
qq|@<<<<<<<<<<<\n|
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_I {
my
$self
=
shift
;
my
$x
=
shift
;
my
$pri
=
$self
->attr(
'primary_key'
);
my
@args
= ();
my
$top
=
''
;
my
$format
=
qq|$$x{$pri}<br>\n|
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_l {
my
$self
=
shift
;
my
$x
=
shift
;
my
$obj_key_oid
=
ucfirst
(
$self
->attr(
'key'
)).
' ID'
;
$obj_key_oid
.= (
' '
x (12 -
length
(
$obj_key_oid
)));
my
$pri
=
$self
->attr(
'primary_key'
);
my
@args
= (
$$x
{
$pri
},
$$x
{
'name'
},
$$x
{
'bug_count'
},
$$x
{
'created'
},
$$x
{
'subject'
},
);
my
$top
=
qq|
$obj_key_oid Name Bugids Created Subject|
;
my
$format
=
qq|
@<<<<<<<<<<< @<<<<<<<<<<<<< @<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<
|
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_a {
my
$self
=
shift
;
my
$x
=
shift
;
my
$obj_key_oid
=
ucfirst
(
$self
->attr(
'key'
)).
' ID'
;
$obj_key_oid
.= (
' '
x (12 -
length
(
$obj_key_oid
)));
my
$pri
=
$self
->attr(
'primary_key'
);
my
@args
= (
$$x
{
$pri
},
$$x
{
'name'
},
$$x
{
'created'
},
$$x
{
'ts'
},
$$x
{
'subject'
},
);
my
$top
=
qq|
$obj_key_oid Name Created Modified|
;
my
$format
=
qq|
@<<<<<<<<<<< @<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<
Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
;
foreach
my
$key
(
keys
%{
$x
}) {
if
(
$key
=~ /^([a-z]+)_ids$/o) {
push
(
@args
,
$$x
{
"${1}_count"
},
$$x
{
$key
});
$format
.=
sprintf
(
'%-16s'
,
$key
.
': '
).
'@<<<<<< @'
.(
'<'
x 55).
"...\n"
;
}
}
push
(
@args
,
$$x
{
'body'
});
$format
.=
"\n\@\*\n"
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_A {
my
$self
=
shift
;
my
$x
=
shift
;
my
$obj_key_oid
=
ucfirst
(
$self
->attr(
'key'
)).
' ID'
;
$obj_key_oid
.= (
' '
x (12 -
length
(
$obj_key_oid
)));
my
$pri
=
$self
->attr(
'primary_key'
);
my
@args
= (
$$x
{
$pri
},
$$x
{
'name'
},
$$x
{
'bug_count'
},
$$x
{
'created'
},
$$x
{
'subject'
},
$$x
{
'header'
},
$$x
{
'body'
},
$$x
{
'bug_ids'
}
);
my
$top
=
qq|
$obj_key_oid Name Bugids Createdx Subject|
;
my
$format
=
qq|
-------------------------------------------------------------------------------
@<<<<<<<<<<< @<<<<<<<<<<<<< @<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<
@*
@*
@*
|
;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_L {
my
$self
=
shift
;
my
$x
=
shift
;
my
$key
=
ucfirst
(
$self
->attr(
'key'
));
my
$pri
=
$self
->attr(
'primary_key'
);
my
$top
=
qq|
</table><table border=1 width=100%>
<tr>
<td width=25%><b>$key ID</b></td><td><b>Bug ID</b></td>
<td><b>Source address</b></td><td><b>Created</b></td><td><b>Subject</b></td>
</tr>
|
;
my
$format
=
qq|
<tr><td>$$x{'select'} $$x{'name'} $$x{$pri} </td>
<td>$$x{'bug_count'}</td>
<td>$$x{'sourceaddr'}</td>
<td>$$x{'created'}</td>
<td>$$x{'subject'}</td>
</tr>
</table>
|
;
return
(
$top
,
$format
, ());
}
sub
FORMAT_h {
my
$self
=
shift
;
my
$x
=
shift
;
my
$key
=
ucfirst
(
$self
->attr(
'key'
));
my
$pri
=
$self
->attr(
'primary_key'
);
$^W = 0;
my
$top
=
qq|<table border=1 width=100%>
<tr>
<td width=25%><b>$key ID $$x{'name'}</b></td>
<td><b>Bug IDs</b></td>
<td><b>Name</b></td>
<td><b>Created</b></td>
<td><b>Modified</b></td>
</tr>|
;
my
$format
=
qq|<tr>
<td>$$x{$pri} </td>
<td>$$x{'bug_ids'} </td>
<td>$$x{'name'} </td>
<td>$$x{'created'} </td>
<td>$$x{'modified'} </td>
</tr>
<tr>
<td><b>Subject:</b></td>
<td colspan=5>$$x{'subject'} </td>
</tr>
</table>
<table border=1 width=100%><tr><td colspan=4><b>Message body:</b></td></tr><tr><td colspan=4>
$$x{'body'}
</td></tr></table>|
;
return
(
$top
,
$format
, ());
}
sub
FORMAT_H {
my
$self
=
shift
;
my
$x
=
shift
;
my
$key
=
ucfirst
(
$self
->attr(
'key'
));
my
$pri
=
$self
->attr(
'primary_key'
);
my
$top
=
qq|
<table border=1 width=100%>
<tr>
<td width=25%><b>$key ID</b></td>
<td><b>Bug IDs</b></td>
<td><b>Name</b></td>
<td><b>Created</b></td>
<td><b>Modified</b></td>
<td><b> </b></td>
</tr>
|
;
my
$format
=
qq|
<tr>
<td>$$x{$pri} $$x{'name'}</td>
<td>$$x{'bug_ids'} </td>
<td>$$x{'name'} </td>
<td>$$x{'created'} </td>
<td>$$x{'modified'} </td>
<td> </td>
</tr>
<tr>
<td><b>Subject:</b></td>
<td colspan=7>$$x{'subject'} </td>
</tr>
</table>
<table border=1 width=100%>
<tr><td colspan=4><b>Message body:</b></td></tr>
<tr><td colspan=4> $$x{'body'} </td></tr>
</table>|
;
return
(
$top
,
$format
, ());
}
sub
FORMAT_x {
my
$self
=
shift
;
my
$x
=
shift
;
my
(
$top
,
$format
,
@args
) =
$self
->FORMAT_a;
return
(
$top
,
$format
,
@args
);
}
sub
FORMAT_X {
my
$self
=
shift
;
my
$x
=
shift
;
my
(
$top
,
$format
,
@args
) =
$self
->FORMAT_A;
return
(
$top
,
$format
,
@args
);
}
1;