Mercurial > pub > Impl
view Lib/IMPL/Code/Binding.pm @ 270:3f59fd828d5f
merge
author | cin |
---|---|
date | Fri, 25 Jan 2013 00:25:02 +0400 |
parents | 6d8092d8ce1b |
children |
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->new( 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 $method = eval $code; #$compiler_env->reval($code,'strict'); return $method; } 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(\@vars,$expression)> Возвращает ссылку на процедуру. =cut