Mercurial > pub > Impl
diff Lib/IMPL/Transform.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 32d2350fccf9 |
children | 4c55aed00ff2 |
line wrap: on
line diff
--- a/Lib/IMPL/Transform.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/IMPL/Transform.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,93 +1,93 @@ -package IMPL::Transform; -use base qw(IMPL::Object); - -use IMPL::Class::Property; -use IMPL::Class::Property::Direct; - -BEGIN { - protected _direct property Templates => prop_all; - protected _direct property Default => prop_all; - protected _direct property Plain => prop_all; -} - -sub CTOR { - my ($this,%args) = @_; - - $this->{$Plain} = delete $args{-plain}; - $this->{$Default} = delete $args{-default}; - - $this->{$Templates} = \%args; -} - -sub Transform { - my ($this,$object,@args) = @_; - - if (not ref $object) { - die new IMPL::Exception("There is no the template for a plain value in the transform") unless $this->{$Plain}; - my $template = $this->{$Plain}; - return $this->$template($object,@args); - } else { - - my $template = $this->MatchTemplate($object) || $this->Default or die new IMPL::Transform::NoTransformException(ref $object); - - return $this->$template($object,@args); - } -} - -sub MatchTemplate { - my ($this,$object) = @_; - my $class = $this->GetClassForObject( $object ); - - foreach my $tClass ( keys %{$this->Templates || {}} ) { - return $this->Templates->{$tClass} if ($tClass eq $class); - } -} - -sub GetClassForObject { - my ($this,$object) = @_; - - return ref $object; -} - -package IMPL::Transform::NoTransformException; -use base qw(IMPL::Exception); - -our %CTOR = ( - 'IMPL::Exception' => sub { 'No transformation', @_ } -); - -1; - -__END__ - -=pod -=head1 SYNOPSIS - -my $obj = new AnyObject; - -my $t = new Transform ( - AnyClass => sub { - my ($this,$object) = @_; - return new NewClass({ Name => $object->name, Document => $this->Transform($object->Data) }) - }, - DocClass => sub { - my ($this,$object) = @_; - return new DocPreview(Author => $object->Author, Text => $object->Data); - }, - -default => sub { - my ($this,$object) = @_; - return $object; - }, - -plain => sub { - my ($this,$object) = @_; - return $object; - } -); - -my $result = $t->Transform($obj); - -=head1 DESCRIPTION - -Преобразование одного объекта к другому, например даных к их представлению. - -=cut \ No newline at end of file +package IMPL::Transform; +use base qw(IMPL::Object); + +use IMPL::Class::Property; +use IMPL::Class::Property::Direct; + +BEGIN { + protected _direct property Templates => prop_all; + protected _direct property Default => prop_all; + protected _direct property Plain => prop_all; +} + +sub CTOR { + my ($this,%args) = @_; + + $this->{$Plain} = delete $args{-plain}; + $this->{$Default} = delete $args{-default}; + + $this->{$Templates} = \%args; +} + +sub Transform { + my ($this,$object,@args) = @_; + + if (not ref $object) { + die new IMPL::Exception("There is no the template for a plain value in the transform") unless $this->{$Plain}; + my $template = $this->{$Plain}; + return $this->$template($object,@args); + } else { + + my $template = $this->MatchTemplate($object) || $this->Default or die new IMPL::Transform::NoTransformException(ref $object); + + return $this->$template($object,@args); + } +} + +sub MatchTemplate { + my ($this,$object) = @_; + my $class = $this->GetClassForObject( $object ); + + foreach my $tClass ( keys %{$this->Templates || {}} ) { + return $this->Templates->{$tClass} if ($tClass eq $class); + } +} + +sub GetClassForObject { + my ($this,$object) = @_; + + return ref $object; +} + +package IMPL::Transform::NoTransformException; +use base qw(IMPL::Exception); + +our %CTOR = ( + 'IMPL::Exception' => sub { 'No transformation', @_ } +); + +1; + +__END__ + +=pod +=head1 SYNOPSIS + +my $obj = new AnyObject; + +my $t = new Transform ( + AnyClass => sub { + my ($this,$object) = @_; + return new NewClass({ Name => $object->name, Document => $this->Transform($object->Data) }) + }, + DocClass => sub { + my ($this,$object) = @_; + return new DocPreview(Author => $object->Author, Text => $object->Data); + }, + -default => sub { + my ($this,$object) = @_; + return $object; + }, + -plain => sub { + my ($this,$object) = @_; + return $object; + } +); + +my $result = $t->Transform($obj); + +=head1 DESCRIPTION + +Преобразование одного объекта к другому, например даных к их представлению. + +=cut