use MooseX::Storage::Engine;
-our $VERSION = '0.18';
+our $VERSION = '0.26';
our $AUTHORITY = 'cpan:STEVAN';
sub pack {
- my ( $self, @args ) = @_;
- my $e = $self->_storage_get_engine_class->new( object => $self );
- $e->collapse_object(@args);
+ my ( $self, %args ) = @_;
+ my $e = $self->_storage_get_engine_class(%args)->new( object => $self );
+ $e->collapse_object(%args);
}
sub unpack {
my ($class, $data, %args) = @_;
- my $e = $class->_storage_get_engine_class->new(class => $class);
-
- $class->_storage_construct_instance(
- $e->expand_object($data, %args),
- \%args
+ my $e = $class->_storage_get_engine_class(%args)->new(class => $class);
+
+ $class->_storage_construct_instance(
+ $e->expand_object($data, %args),
+ \%args
);
}
sub _storage_get_engine_class {
- 'MooseX::Storage::Engine';
+ my ($self, %args) = @_;
+
+ my $default = 'MooseX::Storage::Engine';
+
+ return $default
+ unless (
+ exists $args{engine_traits}
+ && ref($args{engine_traits}) eq 'ARRAY'
+ && scalar(@{$args{engine_traits}})
+ );
+
+ my @roles = map { sprintf("%s::Trait::%s", $default, $_) }
+ @{$args{engine_traits}};
+
+ Moose::Meta::Class->create_anon_class(
+ superclasses => [$default],
+ roles => [ @roles ],
+ cache => 1,
+ )->name;
}
sub _storage_construct_instance {
my ($class, $args, $opts) = @_;
my %i = defined $opts->{'inject'} ? %{ $opts->{'inject'} } : ();
-
+
$class->new( %$args, %i );
}
+no Moose::Role;
+
1;
__END__
package Point;
use Moose;
use MooseX::Storage;
-
+
our $VERSION = '0.01';
-
+
with Storage;
-
+
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
-
+
1;
-
+
my $p = Point->new(x => 10, y => 10);
-
- ## methods to pack/unpack an
+
+ ## methods to pack/unpack an
## object in perl data structures
-
+
# pack the class into a hash
$p->pack(); # { __CLASS__ => 'Point-0.01', x => 10, y => 10 }
-
+
# unpack the hash into a class
my $p2 = Point->unpack({ __CLASS__ => 'Point-0.01', x => 10, y => 10 });
-
+
# unpack the hash, with insertion of paramaters
my $p3 = Point->unpack( $p->pack, inject => { x => 11 } );
=head1 DESCRIPTION
-This is the most basic form of serialization. This is used by default
+This is the most basic form of serialization. This is used by default
but the exported C<Storage> function.
=head1 METHODS
=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.