]> git.vpit.fr Git - perl/modules/CPANPLUS-Dist-Gentoo.git/blob - lib/CPANPLUS/Dist/Gentoo/Atom.pm
Introduce C::D::G::{Atom,Version}
[perl/modules/CPANPLUS-Dist-Gentoo.git] / lib / CPANPLUS / Dist / Gentoo / Atom.pm
1 package CPANPLUS::Dist::Gentoo::Atom;
2
3 use strict;
4 use warnings;
5
6 our $VERSION = '0.08';
7
8 use Carp         ();
9 use Scalar::Util ();
10
11 use overload (
12  '<=>' => \&cmp,
13  '""'  => \&as_string,
14 );
15
16 use CPANPLUS::Dist::Gentoo::Version;
17
18 my $version_rx = $CPANPLUS::Dist::Gentoo::Version::version_rx;
19
20 sub new {
21  my $class = shift;
22  $class = ref($class) || $class;
23
24  my %args = @_;
25
26  my ($name, $category, $version);
27  if (defined $args{name}) {
28   ($name, $category, $version) = @args{qw/name category version/};
29   Carp::confess('Category unspecified') unless defined $category;
30   /[^\w-]/ and Carp::confess('Invalid argument') for $name, $category;
31  } elsif (defined $args{atom}) {
32   my $atom = $args{atom};
33   $atom =~ m{^([\w-]+)/([\w-]+)-v?($version_rx)$}
34                                                or Carp::confess('Invalid atom');
35   ($name, $category, $version) = ($1, $2, $3);
36  } elsif (defined $args{ebuild}) {
37   my $ebuild = $args{ebuild};
38   $ebuild =~ m{/([\w-]+)/([\w-]+)-v?($version_rx)\.ebuild$}
39                                              or Carp::confess('Invalid ebuild');
40   ($name, $category, $version) = ($1, $2, $3);
41  } else {
42   Carp::confess('Not enough information for building an atom object');
43  }
44
45  if (defined $version) {
46   unless (Scalar::Util::blessed($version)
47                               and $_->isa('CPANPLUS::Dist::Gentoo::Version')) {
48    $version = CPANPLUS::Dist::Gentoo::Version->new($version);
49   }
50  }
51
52  bless {
53   category => $category,
54   name     => $name,
55   version  => $name,
56  }, $class;
57 }
58
59 BEGIN {
60  eval "sub $_ { \$_[0]->{$_} }" for qw/category name version/;
61 }
62
63 sub cmp {
64  my ($a1, $a2, $r) = @_;
65
66  my $v1 = $a1->version;
67
68  my $v2;
69  if (Scalar::Util::blessed($a2) and $a2->isa(__PACKAGE__)) {
70   Carp::confess('Can\'t compare atoms of different packages')
71                     if $a1->category ne $a2->category or $a1->name ne $a2->name;
72   $v2 = $a2->version;
73  } else {
74   $v2 = $a2;
75  }
76
77  ($v1, $v2) = ($v2, $v1) if $r;
78
79  return $v1 <=> $v2;
80 }
81
82 sub as_string {
83  my ($a) = @_;
84
85  $a->category . '/' . $a->name . '-' . $a->version;
86 }
87
88 1;