X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FStorage.pm;h=2ab32aaf64f604416dc39b33df97e19be286c6d5;hb=d3671a48f9673b8f5e74f9105b56406e4bfe5a6b;hp=78c898ba47717d0f6e92391591046dba1ec45cda;hpb=8919e01e95856d3dd17037352ef93275cdcf2fbd;p=gitmo%2FMooseX-Storage.git diff --git a/lib/MooseX/Storage.pm b/lib/MooseX/Storage.pm index 78c898b..2ab32aa 100644 --- a/lib/MooseX/Storage.pm +++ b/lib/MooseX/Storage.pm @@ -1,13 +1,9 @@ - package MooseX::Storage; use Moose qw(confess); use MooseX::Storage::Meta::Attribute::DoNotSerialize; use String::RewritePrefix (); -our $VERSION = '0.26'; -our $AUTHORITY = 'cpan:STEVAN'; - sub import { my $pkg = caller(); @@ -21,16 +17,28 @@ sub import { my %HORRIBLE_GC_AVOIDANCE_HACK; -sub __expand_role { - my ($base, $value) = @_; +sub _rewrite_role_name { + my ($self, $base, $string) = @_; + + my $role_name = scalar String::RewritePrefix->rewrite( + { + '' => "MooseX::Storage::$base\::", + '=' => '', + }, + $string, + ); +} + +sub _expand_role { + my ($self, $base, $value) = @_; return unless defined $value; if (ref $value) { - my ($class, $param, $no) = @$value; - confess "too many args in arrayref role declaration" if defined $no; + confess "too many args in arrayref role declaration" if @$value > 2; + my ($class, $param) = @$value; - $class = __expand_role($base => $class); + $class = $self->_rewrite_role_name($base => $class); Class::MOP::load_class($class); my $role = $class->meta->generate_role(parameters => $param); @@ -38,16 +46,20 @@ sub __expand_role { $HORRIBLE_GC_AVOIDANCE_HACK{ $role->name } = $role; return $role->name; } else { - my $role = scalar String::RewritePrefix->rewrite( - { - '' => "MooseX::Storage::$base\::", - '=' => '', - }, - $value, - ); - - Class::MOP::load_class($role); - return $role; + my $class = $self->_rewrite_role_name($base, $value); + Class::MOP::load_class($class); + + my $role = $class; + + if ($class->meta->isa( + 'MooseX::Role::Parameterized::Meta::Role::Parameterizable' + )) { + $role = $class->meta->generate_role(parameters => undef); + $HORRIBLE_GC_AVOIDANCE_HACK{ $role->name } = $role; + return $role->name; + } + + return $class; } } @@ -56,13 +68,13 @@ sub _injected_storage_role_generator { $params{base} = '=MooseX::Storage::Basic' unless defined $params{base}; - my @roles = __expand_role(Base => $params{base}); + my @roles = __PACKAGE__->_expand_role(Base => $params{base}); # NOTE: # you don't have to have a format # role, this just means you dont # get anything other than pack/unpack - push @roles, __expand_role(Format => $params{format}); + push @roles, __PACKAGE__->_expand_role(Format => $params{format}); # NOTE: # many IO roles don't make sense unless @@ -75,13 +87,13 @@ sub _injected_storage_role_generator { # us. This allows the StorableFile to work #(exists $params{'format'}) # || confess "You must specify a format role in order to use an IO role"; - push @roles, __expand_role(IO => $params{io}); + push @roles, __PACKAGE__->_expand_role(IO => $params{io}); # Note: # These traits alter the behaviour of the engine, the user can # specify these per role-usage for my $trait ( @{ $params{'traits'} ||= [] } ) { - push @roles, __expand_role(Traits => $trait); + push @roles, __PACKAGE__->_expand_role(Traits => $trait); } return @roles; @@ -171,7 +183,7 @@ class name and each instance attribute is stored. Very simple. This level is not optional, it is the bare minumum that MooseX::Storage provides and all other levels build on top of this. -See L for the fundamental implementation and +See L for the fundamental implementation and options to C and C =item B @@ -190,7 +202,7 @@ The third (io) level is C and C. In this level we are reading and writing data to file/network/database/etc. This level is also optional, in most cases it does require a C role -to also be used, the expection being the C role. +to also be used, the exception being the C role. =back @@ -256,7 +268,7 @@ over anyway. =head1 CAVEAT -This is B a persistence framework, changes to your object after +This is B a persistence framework; changes to your object after you load or store it will not be reflected in the stored class. =head1 EXPORTS @@ -265,7 +277,7 @@ you load or store it will not be reflected in the stored class. =item B -This module will export the C method will can be used to +This module will export the C method and can be used to load a specific set of MooseX::Storage roles to implement a specific combination of features. It is meant to make things easier, but it is by no means the only way. You can still compose your roles by