Mercurial > pub > Impl
comparison lib/IMPL/Class/Template.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children | ee36115f6a34 |
comparison
equal
deleted
inserted
replaced
406:f23fcb19d3c1 | 407:c6e90e02dd17 |
---|---|
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 | |
21 C<IMPL::Class::Template> базовый класс для шаблонов. | |
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 | |
80 Шаблоны используются для динамической генерации классов. Процесс создания класса | |
81 по шаблону называется специализацией, при этом создается новый класс: | |
82 | |
83 =over | |
84 | |
85 =item 1 | |
86 | |
87 Обявляется новый пакет с именем, вычисленным из имени и параметров шаблона | |
88 | |
89 =item 2 | |
90 | |
91 Формируется массив C<@ISA> для созаднного класса, в который добавляется имя шаблона | |
92 | |
93 =item 3 | |
94 | |
95 Формируются методы с именами параметров шаблона, возвращающие реальные значения параметров | |
96 | |
97 =item 4 | |
98 | |
99 Вызывается метод для конструирования специализиции | |
100 | |
101 =back | |
102 | |
103 =head1 MEMBERS | |
104 | |
105 =over | |
106 | |
107 =item C<spec(@params)> | |
108 | |
109 Метод, создающий специализацию шаблона. Может быть вызван как оператор. | |
110 | |
111 =back | |
112 | |
113 =cut |