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