comparison Lib/IMPL/Class/Template.pm @ 165:76515373dac0

Added Class::Template, Rewritten SQL::Schema 'use parent' directive instead of 'use base'
author wizard
date Sat, 23 Apr 2011 23:06:48 +0400
parents
children d1676be8afcc
comparison
equal deleted inserted replaced
164:eb3e9861a761 165:76515373dac0
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