Mac-OSVersion-Lite

 view release on metacpan or  search on metacpan

lib/Mac/OSVersion/Lite.pm  view on Meta::CPAN

package Mac::OSVersion::Lite;
use strict;
use warnings;
use utf8;

our $VERSION = "0.10";

use constant VERSION_FORMAT    => qr/(?<major>[0-9]+)(?:\.(?<minor>[0-9]+))?(?:\.(?<point>[0-9]+))?/;
use constant MAC_VERSION_NAMES => {
    catalina      => "10.15",
    mojave        => "10.14",
    high_sierra   => "10.13",
    sierra        => "10.12",
    el_capitan    => "10.11",
    yosemite      => "10.10",
    mavericks     => "10.9",
    mountain_lion => "10.8",
    lion          => "10.7",
    snow_leopard  => "10.6",
    leopard       => "10.5",
    tiger         => "10.4",
};

use overload (
    q{""}    => \&as_string,
    q{<=>}   => \&_cmp,
    fallback => 1,
);

sub major { shift->{major} }
sub minor { shift->{minor} }

sub new {
    my $class = shift;
    my $self  = bless {} => $class;

    $self->_init_by_current_version     if @_ == 0;
    $self->_init_by_version_string(@_)  if @_ == 1;
    $self->_init_by_version_numbers(@_) if @_ >= 2;

    return $self;
}

sub _init_by_current_version {
    my $self    = shift;
    my $command = '/usr/bin/sw_vers -productVersion';
    my $version = `$command`;

    die "Command \`$command\` failed: $version (exit code: $?)\n" if $? != 0;

    $self->_init_by_version_string($version);
}

sub _init_by_version_string {
    my ($self, $string) = @_;

    if (defined MAC_VERSION_NAMES->{$string}) {
        $string = MAC_VERSION_NAMES->{$string};
    }

    die "Invalid format: $string\n" unless $string =~ qr/^@{[VERSION_FORMAT]}$/;

    $self->{major} = $+{major};
    $self->{minor} = $+{minor} // 0;
}

sub _init_by_version_numbers {
    my ($self, $major, $minor) = @_;

    $self->{major} = $major // 0;
    $self->{minor} = $minor // 0;
}

sub name {
    my $self = shift;
    my %map  = reverse %{ MAC_VERSION_NAMES() };
    return $map{$self->as_string};
}

sub as_string {
    my $self = shift;
    return $self->{major}.'.'.$self->{minor};
}

sub _cmp {
    my ($self, $other) = @_;

    return $self->{major} <=> $other->{major} if $self->{major} != $other->{major};
    return $self->{minor} <=> $other->{minor};
}

1;
__END__

=encoding utf-8

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.949 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )