Mercurial > pub > Impl
comparison Lib/IMPL/Code/Binding.pm @ 225:a1e868b0fba9
Bindings concept in progress
author | sergey |
---|---|
date | Fri, 31 Aug 2012 16:41:18 +0400 |
parents | |
children | b6cde007a175 |
comparison
equal
deleted
inserted
replaced
224:e6c050db7d98 | 225:a1e868b0fba9 |
---|---|
1 package IMPL::Code::Binding; | |
2 use strict; | |
3 | |
4 use IMPL::require { | |
5 Exception => 'IMPL::Exception', | |
6 ArgumentException => '-IMPL::ArgumentException' | |
7 }; | |
8 | |
9 sub new { | |
10 my ($self,$expr,$vars) = @_; | |
11 | |
12 $vars ||= []; | |
13 | |
14 die ArgumentException( vars => 'A reference to an array is required') | |
15 unless ref $vars eq 'ARRAY'; | |
16 | |
17 m/^\w+$/ or die ArgumentException->new( vars => 'A valid variable name is required', $_ ) | |
18 foreach @$vars; | |
19 | |
20 my $varnames = join (',', map { "\$$_" } @$vars); | |
21 | |
22 my $code = <<CODE; | |
23 sub { | |
24 my ($varnames) = \@_; | |
25 $text | |
26 } | |
27 CODE | |
28 my $body = eval $code; #$compiler_env->reval($code,'strict'); | |
29 | |
30 | |
31 } | |
32 | |
33 1; | |
34 | |
35 __END__ | |
36 | |
37 =pod | |
38 | |
39 =head1 NAME | |
40 | |
41 C<IMPL::Code::Binding> - превращает выражения в связыватель | |
42 | |
43 =head1 SYNOPSIS | |
44 | |
45 =begin code | |
46 | |
47 use IMPL::require { | |
48 Binding => 'IMPL::Code::Binding' | |
49 } | |
50 | |
51 my $person = DB->SearchPerson({name => 'Peter'})->First; | |
52 | |
53 my $bind = Binding->new( | |
54 [qw(obj)] => q{ $obj->addresses->[0]->country->code } | |
55 ); | |
56 | |
57 print $bind->($person); | |
58 | |
59 =end | |
60 | |
61 =head1 DESCRIPTION | |
62 | |
63 Позвоялет преобразовать выражение в функцию, которую можно будет многократно | |
64 использовать для получения значения выражения. | |
65 | |
66 Выражение параметризуется произвольным количеством именованных параметров, | |
67 которые будут доступны внутри выражения как переменные. При создании связывателя | |
68 в конструктор передается выражение связывания, ссылка насписок из параметров | |
69 и могут быть переданы связи для копозиции. | |
70 | |
71 При создания связывателя будет проверен синтаксис, и если в выражении допущена | |
72 ошибка, возникнет исключение. | |
73 | |
74 Данный класс не является безопасным при создании связывателей из ненадежных | |
75 источников, поскольку внутри будет выполнен C<eval>. | |
76 | |
77 =head1 MEMBERS | |
78 | |
79 =head2 C<new($expression,\@vars,\%bindings)> | |
80 | |
81 Возвращает ссылку на процедуру. | |
82 | |
83 =cut |