X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStorage%2FTraits%2FOnlyWhenBuilt.pm;h=f918b4689802c9850200293f6ce094521cae273e;hb=004bf3ea04d7818116a94bb4b387d8ae1dd10f9a;hp=a3b9752ef0e2953b77a2daf92ee687a8ffa557fb;hpb=76218b465af423661a8b711a20e3e458f9adbb08;p=gitmo%2FMooseX-Storage.git diff --git a/lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm b/lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm index a3b9752..f918b46 100644 --- a/lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm +++ b/lib/MooseX/Storage/Traits/OnlyWhenBuilt.pm @@ -1,9 +1,28 @@ package MooseX::Storage::Traits::OnlyWhenBuilt; use Moose::Role; -our $VERSION = '0.18'; +our $VERSION = '0.28'; our $AUTHORITY = 'cpan:STEVAN'; +requires 'pack'; +requires 'unpack'; + +around 'pack' => sub { + my ($orig, $self, %args) = @_; + $args{engine_traits} ||= []; + push(@{$args{engine_traits}}, 'OnlyWhenBuilt'); + $self->$orig(%args); +}; + +around 'unpack' => sub { + my ($orig, $self, $data, %args) = @_; + $args{engine_traits} ||= []; + push(@{$args{engine_traits}}, 'OnlyWhenBuilt'); + $self->$orig($data, %args); +}; + +no Moose::Role; + 1; __END__ @@ -20,29 +39,28 @@ MooseX::Storage::Traits::OnlyWhenBuilt - A custom trait to bypass serialization { package Point; use Moose; use MooseX::Storage; - + with Storage( traits => [qw|OnlyWhenBuilt|] ); - + has 'x' => (is => 'rw', lazy_build => 1 ); has 'y' => (is => 'rw', lazy_build => 1 ); has 'z' => (is => 'rw', builder => '_build_z' ); - - + sub _build_x { 3 } sub _build_y { expensive_computation() } sub _build_z { 3 } - + } - + my $p = Point->new( 'x' => 4 ); - + # the result of ->pack will contain: # { x => 4, z => 3 } $p->pack; - + =head1 DESCRIPTION -Sometimes you don't want a particular attribute to be part of the +Sometimes you don't want a particular attribute to be part of the serialization if it has not been built yet. If you invoke C as outlined in the C, only attributes that have been built (ie, where the predicate returns 'true') will be serialized. @@ -62,7 +80,7 @@ See the SYNOPSIS for a nice example that can be easily cargo-culted. =head1 BUGS -All complex software has bugs lurking in it, and this module is no +All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT.