Mercurial > pub > Impl
diff Lib/CDBI/Transform.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | 76515373dac0 |
line wrap: on
line diff
--- a/Lib/CDBI/Transform.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/CDBI/Transform.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,105 +1,105 @@ -package CDBI::Transform::FormToObject; -use strict; -use warnings; - -use base qw(IMPL::Object::Autofill Form::Transform ); -use IMPL::Class::Property; -require IMPL::Exception; - -BEGIN { - public property Class => prop_all; - public property Namespace => prop_all; -} - -sub CTOR { - my $this = shift; - $this->superCTOR(@_); - - die new IMPL::InvalidArgumentException('Class is required') unless $this->Class; -} - -sub TransformContainer { - my ($this,$container) = @_; - - my $class; - if ($container->Name eq 'Form') { - $class = $this->Class; - } else { - $class = $this->_mk_class($container->Attributes->{'cdbi.class'}) or die new IMPL::Exception('cdbi.class isn\'t specified',$container->Id->Canonical); - } - - my %data; - - #my %columns = map {$_,1} $class->columns(); - - no strict 'refs'; - my @accessors = map $_->accessor, $class->columns();# grep $columns{lc $_}, keys %{"${class}::"}; - - # формируем из контейнера формы данные для объекта - foreach my $column ( @accessors, 'id' ) { - my ($val) = $container->GetChild($column); - $data{$column} = $this->Transform($val) if $val; - } - - my $obj; - if ($data{id}) { - # edit value - - - $obj = $class->validateId($data{id}); - my %filter = map { $_, $obj->$_()} @accessors; - $filter{$_} = $data{$_} foreach keys %data; - my ($newObj) = $class->lookup(\%data); - die new IMPL::DuplicateException('The object already exists', $class) if ($newObj and $newObj->id != $data{id}); - - $obj->$_($data{$_}) foreach keys %data; - $obj->update(); - } else { - # new instance - die new IMPL::DuplicateException('The object already exists', $class) if $class->lookup(\%data); - $obj = $class->insert(\%data); - } - return $obj; -} - -sub _mk_class { - my ($this,$name) = @_; - - return unless $name; - return $name if $name =~ /::/; - return $this->Namespace ? $this->Namespace."::$name" : $name; -} - -package CDBI::Transform::ObjectToForm; -use base qw(IMPL::Transform); - -use IMPL::Class::Property; - -sub CTOR { - my $this = shift; - - $this->superCTOR( - Default => \&TransformObject, - Plain => sub { my ($this,$val) = @_; return $val; } - ); -} - -sub TransformObject { - my ($this,$object) = @_; - - return $object if not ref $object; - - my %data; - foreach my $column ( (map $_->accessor,$object->columns()),'id') { - my $value = $object->$column(); - - if (ref $value eq 'HASH') { - $data{"$column/$_"} = $value->{$_} foreach keys %$value; - } else { - $data{$column} = $value; - } - } - - return \%data; -} -1; +package CDBI::Transform::FormToObject; +use strict; +use warnings; + +use base qw(IMPL::Object::Autofill Form::Transform ); +use IMPL::Class::Property; +require IMPL::Exception; + +BEGIN { + public property Class => prop_all; + public property Namespace => prop_all; +} + +sub CTOR { + my $this = shift; + $this->superCTOR(@_); + + die new IMPL::InvalidArgumentException('Class is required') unless $this->Class; +} + +sub TransformContainer { + my ($this,$container) = @_; + + my $class; + if ($container->Name eq 'Form') { + $class = $this->Class; + } else { + $class = $this->_mk_class($container->Attributes->{'cdbi.class'}) or die new IMPL::Exception('cdbi.class isn\'t specified',$container->Id->Canonical); + } + + my %data; + + #my %columns = map {$_,1} $class->columns(); + + no strict 'refs'; + my @accessors = map $_->accessor, $class->columns();# grep $columns{lc $_}, keys %{"${class}::"}; + + # формируем из контейнера формы данные для объекта + foreach my $column ( @accessors, 'id' ) { + my ($val) = $container->GetChild($column); + $data{$column} = $this->Transform($val) if $val; + } + + my $obj; + if ($data{id}) { + # edit value + + + $obj = $class->validateId($data{id}); + my %filter = map { $_, $obj->$_()} @accessors; + $filter{$_} = $data{$_} foreach keys %data; + my ($newObj) = $class->lookup(\%data); + die new IMPL::DuplicateException('The object already exists', $class) if ($newObj and $newObj->id != $data{id}); + + $obj->$_($data{$_}) foreach keys %data; + $obj->update(); + } else { + # new instance + die new IMPL::DuplicateException('The object already exists', $class) if $class->lookup(\%data); + $obj = $class->insert(\%data); + } + return $obj; +} + +sub _mk_class { + my ($this,$name) = @_; + + return unless $name; + return $name if $name =~ /::/; + return $this->Namespace ? $this->Namespace."::$name" : $name; +} + +package CDBI::Transform::ObjectToForm; +use base qw(IMPL::Transform); + +use IMPL::Class::Property; + +sub CTOR { + my $this = shift; + + $this->superCTOR( + Default => \&TransformObject, + Plain => sub { my ($this,$val) = @_; return $val; } + ); +} + +sub TransformObject { + my ($this,$object) = @_; + + return $object if not ref $object; + + my %data; + foreach my $column ( (map $_->accessor,$object->columns()),'id') { + my $value = $object->$column(); + + if (ref $value eq 'HASH') { + $data{"$column/$_"} = $value->{$_} foreach keys %$value; + } else { + $data{$column} = $value; + } + } + + return \%data; +} +1;