view Lib/IMPL/Web/View/Metadata/FormMeta.pm @ 365:7c621bb95e53

working on the metadata model
author sergey
date Mon, 02 Dec 2013 02:13:12 +0400
parents 82b6c967bcf1
children 935629bf80df
line wrap: on
line source

package IMPL::Web::View::Metadata::FormMeta;
use strict;

use IMPL::Const qw(:prop);
use IMPL::declare {
	require => {
		Exception => 'IMPL::Exception',
		ArgException => '-IMPL::InvalidArgumentException'
	},
	base => [
		'IMPL::Web::View::Metadata::BaseMeta' => '@_'
	],
	props => [
		nodes => PROP_RO,
		decl  => PROP_RO,
		schema => PROP_RO,
		errors => PROP_RO
	]
};

sub CTOR {
	my ($this,$provider,$model,$type,$args) = @_;
	
	if ($args) {
		$this->$_($args->{$_}) foreach grep $args->{$_}, qw(decl schema nodes errors);
	}
	
	$this->$_() || die ArgException->new($_ => "The $_ is required")
		foreach qw(decl schema);
}

sub isMultiple {
	shift->decl->isMultiple;
}

sub isOptional {
	shift->decl->isOptional;
}


sub GetOwnErrors {
	my ($this) = @_;
	
	my $node = undef;
	
	$node = not($this->isMultiple) && $this->nodes ? $this->nodes->[0] : undef;
	
	return [
		grep {
			($node && $_->node && $_->node == $node) || (not($node) && $_->schema == $this->decl )
		} @{$this->errors || []}
	];
}

1;

__END__

=pod

=head1 NAME

=head1 SYNOPSIS

=head1 DESCRIPTION

Расширенные метаданные модели для элементов формы, помимо стандартных свойств
сожержит в себе информацию о схеме.

=head1 MEMBERS

=head2 C<[get]errors>

Ссылка на массив с ошибками при проверке схемы. Ошибки относятся ко всем
узлам в текущей модели, включая вложенные и т.п.

=head2 C<[get]model>

Ссылка на элемент документа, либо на массив с элементами для множественных
значений (C<isMultiple = true>). В том случае, когда документ был не
корректен и для не множественного элемента было передено несколько значений,
данное свойство будет содержать только первое.

=head2 C<[get]nodes>

Ссылка на массив с узлами документа. В теории количество узлов может быть
произвольным, поскольку документ может быть некорректным, т.е. их может
быть более одного в то время, как C<isMultiple = false> или, напротив, ни
одного при C<isOptional = false>.

=head2 C<[get]modelType>

Название типа данных из схемы документа (C<< schema->name >>), если тип не имеет название, то это
C<ComplexNode> для сложных узлов и C<SimpleNode> для простых.

Для моделей с множественными значениями это свойство означает тип элементов.

=head2 C<[get]decl>

Объявление элемента формы, объявление может совпадать со схемой в случае,
когда это был C<SimpleNode> или C<ComplexNode>, иначе это C<Node> ссылающийся
на заранее обпределенный тип.

=head2 C<[get]schema>

Схема текущего элемента, C<СomlexType>, C<SimpleType>, C<ComplexNode> или
C<SimpleNode>.

=head2 C<[get]isOptional>

Данный элемент может не иметь ни одного значения

=head2 C<[get]isMultiple>

Данный элемент может иметь более одного значения. Модель с множественными
значениями является сложным элементом, в котором дочерними моделями являются
не свойства а сами элементы, в данном случае они их именами будут индексы.

=begin code

for(my $i=0; $i< 10; $i++) {
	display_model(
		$meta->model->[$i],
		schema => meta->schema, 
	);
}

=end code

=head2 C<GetOwnErrors()>

Возвращает ошибки относящиеся к самому элементу C<model>, это принципиально
для контейнеров и в случаях, когда модель не корректна и в ней присутствуют
лишние значения.  

=cut