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