summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2011-03-27 14:33:59 +0100
committerdakkar <dakkar@thenautilus.net>2011-03-27 14:37:30 +0100
commitc9af26b1194f693cd55fd9a7850bc168aeba7d27 (patch)
treef15e7ac877c3b9e3428318c7d91897665b54a581
parentmany more BrowserObjects (diff)
downloadDeWeave-c9af26b1194f693cd55fd9a7850bc168aeba7d27.tar.gz
DeWeave-c9af26b1194f693cd55fd9a7850bc168aeba7d27.tar.bz2
DeWeave-c9af26b1194f693cd55fd9a7850bc168aeba7d27.zip
rework object creation
now we unpack args before calling ->new
-rw-r--r--lib/DeWeave/Collection.pm21
-rw-r--r--lib/DeWeave/EDO.pm33
-rw-r--r--lib/DeWeave/Exception/Deleted.pm9
-rw-r--r--lib/DeWeave/WBO.pm25
4 files changed, 31 insertions, 57 deletions
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);