package MooseX::Storage::Traits::OnlyWhenBuilt; use Moose::Role; our $VERSION = '0.30'; 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__ =pod =head1 NAME MooseX::Storage::Traits::OnlyWhenBuilt - A custom trait to bypass serialization =head1 SYNOPSIS { 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 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. This avoids any potentially expensive computations. See the SYNOPSIS for a nice example that can be easily cargo-culted. =head1 METHODS =head2 Introspection =over 4 =item B =back =head1 BUGS 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. =head1 AUTHOR Stevan Little Estevan.little@iinteractive.comE =head1 COPYRIGHT AND LICENSE Copyright 2007-2008 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut