view lib/IMPL/Web/View/Metadata/BaseMeta.pm @ 412:30e8c6a74937 ref20150831

working on di container (role based registrations)
author cin
date Mon, 21 Sep 2015 19:54:10 +0300
parents c6e90e02dd17
children
line wrap: on
line source

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

use IMPL::lang;
use IMPL::Const qw(:prop);
use IMPL::declare {
	require => {
		Exception => 'IMPL::Exception',
		ArgException => '-IMPL::InvalidArgumentException',
		NotImplException => '-IMPL::NotImplementedException'
	},
	base => [
		'IMPL::Object' => undef
	],
	props => [
		model => PROP_RO,
		modelType => PROP_RO,
		name => PROP_RO,
		label => PROP_RO,
		container => PROP_RO,
		template => PROP_RO,
		
		_childMap => PROP_RO,
		_childNames => PROP_RO
	]
};

sub CTOR {
	my ($this,$model,$type,$args) = @_;
	
	$this->model($model);
	$this->modelType($type);
	$this->_childMap({});
	
	#mixin other args
	if ($args) {
		$this->$_($args->{$_}) foreach grep $args->{$_}, qw(name label container template);
	}
}

sub GetProperty {
	my ($this,$name) = @_;
	
	$this->GetProperties()
		unless $this->_childNames;
	
	return $this->_childMap->{$name};
}

sub GetProperties {
	my ($this) = @_;
	
	if ($this->_childNames) {
		return [ map $this->_childMap->{$_}, @{$this->_childNames} ];
	} else {
		my @childNames;
		my %childMap;
		my @result; 
	
		foreach my $child (@{$this->PopulateProperties()}) {
			$childMap{$child->name} = $child;
			push @childNames, $child->name;
			push @result, $child;
		}
		
		$this->_childMap(\%childMap);
		$this->_childNames(\@childNames);
		return \@result;
	}	
}

sub PopulateProperties {
	my ($this) = @_;
	
	die NotImplException->new();
}

sub GetItems {
	my ($this) = @_;
	
	die NotImplException->new();
}

sub GetItem {
	my ($this,$index) = @_;
	
	die NotImplException->new();
}

1;

__END__

=pod

=head1 NAME

=head1 SYNOPSIS

=head1 DESCRIPTION

Метаданные описывают модель, ее свойства, используются для построения
представления.

=over

=item * type

Опционально. Тип модели. В случаях, когда модель не определена, данное свойство
позволяет определить ее тип.

=item * label

Опционально. Имя модели для отображения.

=item * template

Шаблон, который следует использовать для отображения модели.

=item * fields

Коллекция с информацией по свойствам (полям) модели. Данный хеш используется
для определения представления при использовании C<display_for('field')>.

=back

Метаданные публикуются провайдером, кроме того они могут быть расширены
дополнительными свойствами.

=head1 MEMBERS

=head2 C<GetChild($name)>

Возвращает метаданные для дочернего элемента, например свойства объекта

=head2 C<GetChildren()>

Возвращает ссылку на массив с метаданными для дочерних элементов

=cut