From 42492ea9381104c737617370483f35a9d8f09c5a Mon Sep 17 00:00:00 2001 From: Ricardo SIGNES Date: Sun, 21 Feb 2010 22:35:03 -0500 Subject: [PATCH] add clone and add_requirements methods --- lib/Version/Requirements.pm | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/Version/Requirements.pm b/lib/Version/Requirements.pm index 79d339f..8eb49b3 100644 --- a/lib/Version/Requirements.pm +++ b/lib/Version/Requirements.pm @@ -121,6 +121,27 @@ BEGIN { } } +sub add_requirements { + my ($self, $req) = @_; + + for my $module ($req->__modules) { + my $modifiers = $req->__entry_for($module)->as_modifiers; + for my $modifier (@$modifiers) { + my ($method, @args) = @$modifier; + $self->$method($module => @args); + }; + } + + return $self; +} + +sub clone { + my ($self) = @_; + my $new = (ref $self)->new; + + return $new->add_requirements($self); +} + sub __modules { keys %{ $_[ 0 ] } } sub __entry_for { $_[0]{ $_[1] } } @@ -166,6 +187,8 @@ sub as_string_hash { return \%hash; } +############################################################## + { package Version::Requirements::_Spec::Exact; @@ -175,6 +198,8 @@ sub as_string_hash { sub as_string { return "== $_[0]{version}" } + sub as_modifiers { return [ [ exact_version => $_[0]{version} ] ] } + sub with_exact_version { my ($self, $version) = @_; @@ -202,12 +227,23 @@ sub as_string_hash { } } +############################################################## + { package Version::Requirements::_Spec::Range; sub _self { ref($_[0]) ? $_[0] : (bless { } => $_[0]) } + sub as_modifiers { + my ($self) = @_; + my @mods; + push @mods, [ add_minimum => $self->{minimum} ] if exists $self->{minimum}; + push @mods, [ add_maximum => $self->{maximum} ] if exists $self->{maximum}; + push @mods, map {; [ add_exclusion => $_ ] } @{$self->{exclusions} || []}; + return \@mods; + } + sub as_string { my ($self) = @_;