From c9af26b1194f693cd55fd9a7850bc168aeba7d27 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 27 Mar 2011 14:33:59 +0100 Subject: rework object creation now we unpack args before calling ->new --- lib/DeWeave/Collection.pm | 21 ++++++++++++++------- lib/DeWeave/EDO.pm | 33 --------------------------------- lib/DeWeave/Exception/Deleted.pm | 9 --------- lib/DeWeave/WBO.pm | 25 +++++++++++++++++-------- 4 files changed, 31 insertions(+), 57 deletions(-) delete mode 100644 lib/DeWeave/Exception/Deleted.pm diff --git a/lib/DeWeave/Collection.pm b/lib/DeWeave/Collection.pm index 6ad87eb..874ea94 100644 --- a/lib/DeWeave/Collection.pm +++ b/lib/DeWeave/Collection.pm @@ -43,20 +43,27 @@ sub from_json { DEBUG '$args ',{filter=>\&pp,value=>$args}; - my @items; + my @items;my %deletions; for my $input_item (@$args) { - my $item; - try { - $item = $class->item_class->new({%$input_item,__crypt=>$crypt}) + my $item_args = DeWeave::WBO->unpack_args($input_item,$crypt); + + if (exists $item_args->{deleted}) { + $deletions{$item_args->{id}}=undef; + next; } - catch { - die $_ unless ref($_) && $_->isa('DeWeave::Exception::Deleted'); - }; + + # the $item_args is passed to allow subclasses to + # generate objects of different types for different inputs + my $item = $class->item_class($item_args) + ->new($item_args); + push @items,$item if $item; } + @items = grep { ! exists $deletions{$_->id} } @items; + return $class->new({ items => \@items, }); diff --git a/lib/DeWeave/EDO.pm b/lib/DeWeave/EDO.pm index 81250d2..55422f7 100644 --- a/lib/DeWeave/EDO.pm +++ b/lib/DeWeave/EDO.pm @@ -2,9 +2,6 @@ package DeWeave::EDO; use Moose; use namespace::autoclean; use MooseX::Types::Moose qw(Int Str Num Bool); -use JSON::Any; -use Try::Tiny; -use DeWeave::Exception::Deleted; extends 'DeWeave::WBO'; @@ -35,34 +32,4 @@ has deleted => ( is => 'ro', ); -around BUILDARGS => sub { - my $orig = shift; - my $class = shift; - - my $args = $class->$orig(@_); - return $args unless defined $args->{__crypt}; - return $args unless exists $args->{ciphertext}; - - my $decrypted_payload = $args->{__crypt}->decrypt($args); - - if (defined $decrypted_payload) { - my $j = JSON::Any->new; - my $extra_args = $j->decode($decrypted_payload); - - @$args{keys %$extra_args} = - values %$extra_args; - } - - delete @$args{grep {!defined $args->{$_}} keys %$args}; - - $class->_debug_data('buildargs: ',$args); - - if ($args->{deleted}) { - delete $args->{__crypt}; - die DeWeave::Exception::Deleted->new({args=>$args}); - } - - return $args; -}; - 1; diff --git a/lib/DeWeave/Exception/Deleted.pm b/lib/DeWeave/Exception/Deleted.pm deleted file mode 100644 index 7b2f508..0000000 --- a/lib/DeWeave/Exception/Deleted.pm +++ /dev/null @@ -1,9 +0,0 @@ -package DeWeave::Exception::Deleted; -use Moose; - -has args => ( - is => 'ro', - required => 0, -); - -1; diff --git a/lib/DeWeave/WBO.pm b/lib/DeWeave/WBO.pm index d38120f..0e1e6f8 100644 --- a/lib/DeWeave/WBO.pm +++ b/lib/DeWeave/WBO.pm @@ -41,6 +41,8 @@ has ttl => ( sub _debug_data { my ($self,$msg,$data) = @_; + return unless get_logger()->is_debug; + local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth+1; my %data_clean;my @keys_clean = grep {!/^_/} keys %$data; @@ -61,27 +63,34 @@ sub from_json { $class->_debug_data('$args ',$args); - if (defined $args->{payload}) { - $args->{__crypt}=$crypt; - } + $args = $class->unpack_args($args,$crypt); return $class->new($args); } -around BUILDARGS => sub { - my $orig = shift; - my $class = shift; - - my $args = $class->$orig(@_); +sub unpack_args { + my ($class,$args,$crypt) = @_; return $args unless defined $args->{payload}; my $j = JSON::Any->new; my $extra_args = $j->decode($args->{payload}); + my $decrypt_args = {}; + + if (defined $crypt && exists $extra_args->{ciphertext}) { + my $decrypted_payload = $crypt->decrypt($extra_args); + + if (defined $decrypted_payload) { + $decrypt_args = $j->decode($decrypted_payload); + } + } @$args{keys %$extra_args} = values %$extra_args; + @$args{keys %$decrypt_args} = + values %$decrypt_args; + delete @$args{grep {!defined $args->{$_}} keys %$args}; $class->_debug_data('buildargs: ',$args); -- cgit v1.2.3