407
|
1 package IMPL::Class::Template;
|
|
2 use strict;
|
|
3 use IMPL::lang;
|
|
4
|
|
5 sub makeName {
|
|
6 my ($class,@params) = @_;
|
|
7
|
|
8 $_ =~ s/^.*::(\w+)$/$1/ foreach @params;
|
|
9 return join('',$class,@params);
|
|
10 }
|
|
11
|
|
12 1;
|
|
13
|
|
14 __END__
|
|
15
|
|
16 =pod
|
|
17
|
|
18 =head1 NAME
|
|
19
|
|
20 C<IMPL::Class::Template> базовый класс для шаблонов.
|
|
21
|
|
22 =head1 SYNPOSIS
|
|
23
|
|
24 =begin code
|
|
25
|
|
26 package KeyValuePair;
|
|
27
|
|
28 use IMPL::Class::Property;
|
|
29
|
|
30 use IMPL::template (
|
|
31 parameters => [qw(TKey TValue))],
|
|
32 base => [qw(IMPL::Object IMPL::Object::Autofill)],
|
|
33 declare => sub {
|
|
34 my ($class) = @_;
|
|
35 public $class->CreateProperty(key => prop_get | owner_set, { type => $class->TKey } );
|
|
36 public $class->CreateProperty(value => prop_all, { type => $class->TValue} );
|
|
37
|
|
38 $class->PassThroughArgs;
|
|
39 }
|
|
40 );
|
|
41
|
|
42 BEGIN {
|
|
43 public property id => prop_get | owner_set, { type => 'integer'};
|
|
44 }
|
|
45
|
|
46 __PACKAGE__->PassThroughArgs;
|
|
47
|
|
48 package MyCollection;
|
|
49
|
|
50 use IMPL::Class::Property;
|
|
51
|
|
52 use IMPL::lang;
|
|
53 use IMPL::template(
|
|
54 parameters => [qw(TKey TValue)],
|
|
55 base => [qw(IMPL::Object)],
|
|
56 declare => sub {
|
|
57 my ($class) = @_;
|
|
58 my $item_t = spec KeyValuePair($class->TKey,$class->TValue);
|
|
59
|
|
60 public $class->CreateProperty(items => prop_get | prop_list, { type => $item_t } )
|
|
61
|
|
62 $class->static_accessor( ItemType => $item_t );
|
|
63 }
|
|
64 )
|
|
65
|
|
66 sub Add {
|
|
67 my ($this,$key,$value) = @_;
|
|
68
|
|
69 die new IMPL::ArgumentException( key => "Invalid argument type" ) unless is $key, $this->TKey;
|
|
70 die new IMPL::ArgumentException( value => "Invalid argument type" ) unless is $value, $this->TValue;
|
|
71
|
|
72 $this->items->AddLast( $this->ItemType->new( key => $key, value => $value ) );
|
|
73 }
|
|
74
|
|
75 =end code
|
|
76
|
|
77 =head1 DESCRIPTION
|
|
78
|
|
79 Шаблоны используются для динамической генерации классов. Процесс создания класса
|
|
80 по шаблону называется специализацией, при этом создается новый класс:
|
|
81
|
|
82 =over
|
|
83
|
|
84 =item 1
|
|
85
|
|
86 Обявляется новый пакет с именем, вычисленным из имени и параметров шаблона
|
|
87
|
|
88 =item 2
|
|
89
|
|
90 Формируется массив C<@ISA> для созаднного класса, в который добавляется имя шаблона
|
|
91
|
|
92 =item 3
|
|
93
|
|
94 Формируются методы с именами параметров шаблона, возвращающие реальные значения параметров
|
|
95
|
|
96 =item 4
|
|
97
|
|
98 Вызывается метод для конструирования специализиции
|
|
99
|
|
100 =back
|
|
101
|
|
102 =head1 MEMBERS
|
|
103
|
|
104 =over
|
|
105
|
|
106 =item C<spec(@params)>
|
|
107
|
|
108 Метод, создающий специализацию шаблона. Может быть вызван как оператор.
|
|
109
|
|
110 =back
|
|
111
|
|
112 =cut
|