Mercurial > pub > Impl
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Code/Binding.pm Fri Aug 31 16:41:18 2012 +0400 @@ -0,0 +1,83 @@ +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 \ No newline at end of file