X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler%2FVersionHandler%2FExplicitVersions.pm;fp=lib%2FDBIx%2FClass%2FDeploymentHandler%2FVersionHandler%2FExplicitVersions.pm;h=6566de70cc8c08a3ea43f519d3ca70b12343c84b;hb=c703d15de5286961942f33cdeff6ad978c90d3de;hp=0000000000000000000000000000000000000000;hpb=8a7847f1b8a8ca910d43db22eea85d321b1602c3;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git diff --git a/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm b/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm new file mode 100644 index 0000000..6566de7 --- /dev/null +++ b/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm @@ -0,0 +1,67 @@ +package DBIx::Class::DeploymentHandler::VersionHandler::ExplicitVersions; +use Moose; +use Method::Signatures::Simple; +use Carp 'croak'; + +with 'DBIx::Class::DeploymentHandler::HandlesVersioning'; + +has ordered_versions => ( + is => 'ro', + isa => 'ArrayRef', + required => 1, + trigger => sub { + my $to_version = $_[0]->to_version; + my $db_version = $_[0]->db_version; + + croak 'to_version not in ordered_versions' + unless grep { $to_version eq $_ } @{ $_[1] }; + + for (@{ $_[1] }) { + return if $_ eq $db_version; + croak 'to_version is before database version in ordered_versions' + if $_ eq $to_version; + } + }, +); + +has _version_idx => ( + is => 'rw', + isa => 'Int', + lazy_build => 1, +); + +method _inc_version_idx { $self->_version_idx($self->_version_idx + 1 ) } + +method _build__version_idx { + my $start = $self->version_rs->db_version; + my $idx = 0; + for (@{$self->ordered_versions}) { + return $idx + if $_ eq $self->db_version; + $idx++; + } + croak 'database version not found in ordered_versions!'; +} + +sub next_version_set { # sub instead of method because of when roles get composed + my $self = shift; + return undef + if $self->ordered_versions->[$self->_version_idx] eq $self->to_version; + my $next_idx = $self->_inc_version_idx; + if ( $next_idx <= $#{ $self->ordered_versions }) { + return [ + $self->ordered_versions->[$next_idx - 1], + $self->ordered_versions->[$next_idx ], + ] + } else { + return undef + } +} + +__PACKAGE__->meta->make_immutable; + +1; + +__END__ + +vim: ts=2 sw=2 expandtab