Acme-MomoiroClover

 view release on metacpan or  search on metacpan

lib/Acme/MomoiroClover.pm  view on Meta::CPAN

package Acme::MomoiroClover;

use strict;
use warnings;

use Carp  qw(croak);
use Date::Simple ();
use Acme::MomoiroClover::Z;

our $VERSION = '0.2';

my @members = qw(
    AriyasuMomoka
    FujishiroSumire
    HayamiAkari
    IkuraManami
    KashiwaYukina
    MomotaKanako
    SasakiAyaka
    TakagiReni
    TakaiTsukina
    TamaiShiori
    WagawaMiyuu
);

sub new {
    my $class = shift;
    my $self  = bless {members => []}, $class;

    $self->_check();
    $self->_initialize;

    return $self;
}

sub _check {
    my $self = shift;
    Date::Simple::today() <= Acme::MomoiroClover::Z::change_date() or croak('MomoiroClover is obsolete. Please use Acme::MomoiroClover::Z ');
}

sub members {
    my ($self, $type, @members) = @_;
    @members = @{$self->{members}} unless @members;

    return @members unless $type;

    if ($type eq 'active') {
        return grep {!$_->graduate_date} @members;
    }
    elsif ($type eq 'graduate') {
        return grep {$_->graduate_date}  @members;
    }
    elsif ($type->isa('Date::Simple')) {
        return grep {
            $_->join_date <= $type and
            (!$_->graduate_date or $type <= $_->graduate_date)
        } @members;
    }
}

sub sort {
    my ($self, $type, $order, @members) = @_;
    @members = $self->members unless @members;

    # order by desc if $order is true
    if ($order) {
        return sort {$b->$type <=> $a->$type} @members;
    }
    else {
        return sort {$a->$type <=> $b->$type} @members;
    }
}

sub select {
    my ($self, $type, $number, $operator, @members) = @_;

    $self->_die('invalid operator was passed in')
        unless grep {$operator eq $_} qw(== >= <= > <);

    @members = $self->members unless @members;
    my $compare = eval "(sub { \$number $operator \$_[0] })";

    return grep { $compare->($_->$type) } @members;
}

sub _initialize {
    my $self = shift;

    for my $member (@members) {
        my $module_name = 'Acme::MomoiroClover::Members::'.$member;

        eval qq|require $module_name;|;
        push @{$self->{members}}, $module_name->new;
    }

    return 1;
}



( run in 2.563 seconds using v1.01-cache-2.11-cpan-0fb53d1c279 )