package MooseX::Storage::Traits::OnlyWhenBuilt; # ABSTRACT: A custom trait to bypass serialization our $VERSION = '0.53'; use Moose::Role; use namespace::autoclean; 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); }; 1; __END__ =pod =encoding UTF-8 =head1 NAME MooseX::Storage::Traits::OnlyWhenBuilt - A custom trait to bypass serialization =head1 VERSION version 0.53 =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', predicate => '_has_y' ); 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 (i.e., where the predicate returns 'true') will be serialized. This avoids any potentially expensive computations. =for stopwords culted See the SYNOPSIS for a nice example that can be easily cargo-culted. =head1 SUPPORT Bugs may be submitted through L (or L). There is also a mailing list available for users of this distribution, at L. There is also an irc channel available for users of this distribution, at L on C|irc://irc.perl.org/#moose>. =head1 AUTHORS =over 4 =item * Chris Prather =item * Stevan Little =item * יובל קוג'מן (Yuval Kogman) =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2007 by Infinity Interactive, Inc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut