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