BEGIN {
$Treex::Block::Util::DefinedAttr::VERSION
=
'0.06903_1'
;
}
has
[
qw(tnode anode nnode pnode)
] => (
is
=>
'ro'
,
documentation
=>
'comma separated attributes of nodes on a given layer'
,
);
has
'on_error'
=> (
is
=>
'ro'
,
isa
=> enum( [
qw(warn die)
] ),
default
=>
'warn'
,
documentation
=>
'What to do if undefined attributes are found: warn or die'
,
);
has
'message'
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
default
=>
''
,
documentation
=>
'What to print'
,
);
sub
BUILD {
my
(
$self
) =
@_
;
if
( !
$self
->tnode && !
$self
->anode && !
$self
->nnode && !
$self
->pnode ) {
log_fatal
'One of parameters tnode, anode, nnode, pnode must be specified.'
;
}
return
;
}
sub
process_zone {
my
(
$self
,
$zone
) =
@_
;
if
(
$self
->anode ) {
$self
->check_tree(
$zone
,
'a'
,
$self
->anode ); }
if
(
$self
->tnode ) {
$self
->check_tree(
$zone
,
't'
,
$self
->tnode ); }
if
(
$self
->nnode ) {
$self
->check_tree(
$zone
,
'n'
,
$self
->nnode ); }
if
(
$self
->pnode ) {
$self
->check_tree(
$zone
,
'p'
,
$self
->pnode ); }
return
;
}
sub
check_tree {
my
(
$self
,
$zone
,
$layer
,
$attrs
) =
@_
;
my
$tree
=
$zone
->get_tree(
$layer
);
if
( !
defined
$tree
) {
log_warn
"No $layer-tree in zone "
.
$zone
->get_label();
return
;
}
foreach
my
$node
(
$tree
->get_descendants() ) {
foreach
my
$name
(
split
/,/,
$attrs
) {
my
$value
=
$node
->get_attr(
$name
);
if
( !
defined
$value
) {
my
$address
=
$node
->get_address();
my
$msg
=
"${layer}node\t$address\tundefined attr_name=$name\t"
.
$self
->message;
log_fatal(
$msg
)
if
$self
->on_error eq
'die'
;
log_warn(
$msg
);
}
}
}
return
;
}
1;