Mercurial > pub > Impl
view 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 |
line wrap: on
line source
package IMPL::Code::Binding; use strict; use IMPL::require { Exception => 'IMPL::Exception', ArgumentException => '-IMPL::ArgumentException' }; sub new { my ($self,$expr,$vars) = @_; $vars ||= []; die ArgumentException( vars => 'A reference to an array is required') unless ref $vars eq 'ARRAY'; m/^\w+$/ or die ArgumentException->new( vars => 'A valid variable name is required', $_ ) foreach @$vars; my $varnames = join (',', map { "\$$_" } @$vars); my $code = <<CODE; sub { my ($varnames) = \@_; $text } CODE my $body = eval $code; #$compiler_env->reval($code,'strict'); } 1; __END__ =pod =head1 NAME C<IMPL::Code::Binding> - превращает выражения в связыватель =head1 SYNOPSIS =begin code use IMPL::require { Binding => 'IMPL::Code::Binding' } my $person = DB->SearchPerson({name => 'Peter'})->First; my $bind = Binding->new( [qw(obj)] => q{ $obj->addresses->[0]->country->code } ); print $bind->($person); =end =head1 DESCRIPTION Позвоялет преобразовать выражение в функцию, которую можно будет многократно использовать для получения значения выражения. Выражение параметризуется произвольным количеством именованных параметров, которые будут доступны внутри выражения как переменные. При создании связывателя в конструктор передается выражение связывания, ссылка насписок из параметров и могут быть переданы связи для копозиции. При создания связывателя будет проверен синтаксис, и если в выражении допущена ошибка, возникнет исключение. Данный класс не является безопасным при создании связывателей из ненадежных источников, поскольку внутри будет выполнен C<eval>. =head1 MEMBERS =head2 C<new($expression,\@vars,\%bindings)> Возвращает ссылку на процедуру. =cut