Acme-Keyakizaka46

 view release on metacpan or  search on metacpan

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

    RisaWatanabe
    NeruNagahama
    MaoIguchi
    SarinaUshio
    MemiKakizaki
    YukaKageyama
    ShihoKato
    KyokoSaito
    KumiSasaki
    MireiSasaki
    ManaTakase
    AyakaTakamoto
    MeiHigashimura
    MikuKanemura
    HinaKawata
    NaoKosaka
    SuzukaTomita
    AkariNibu
    HiyoriHamagishi
    KonokaMatsuda
    ManamoMiyata
    MihoWatanabe
);

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

    $self->_initialize;

    return $self;
}

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

    $type = $type ? $type : '';

    if ($type eq 'kanji') {
        return grep {$_->team eq 'kanji'} @members;
    }
    elsif ($type eq 'hiragana') {
        return grep {$_->team eq 'hiragana'} @members;
    }

    return @members;
}

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

    if ($order eq 'desc') {
        return sort {$b->$type <=> $a->$type} @members;
    } else {
        return sort {$a->$type <=> $b->$type} @members;
    }
}

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

    @members = $self->team_members() unless @members;

    if ($type eq 'center') {
        $self->_die('too many args...')
            if ($num_or_str || $operator);

        return grep {$_->{name_en} eq 'Yurina Hirate'} @members;
    }
    else {
        $self->_die('invalid operator was passed in')
            unless grep {$operator eq $_} qw(== >= <= > < eq ne);

        my $compare = eval "(sub { \$num_or_str $operator \$_[0] })";

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

}

sub _initialize {
    my $self = shift;

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

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

    return 1;
}

sub _die {
    my ($self, $message) = @_;
    Carp::croak($message);
}

1;

__END__

=head1 NAME

Acme::Keyakizaka46 - All about Japanse idol group "Keyakizaka46"

=head1 SYNOPSIS

  use Acme::Keyakizaka46;

  my $keyaki = Acme::Keyakizaka46->new;

  # retrieve the members on their activities
  my @members              = $keyaki->team_members;             # retrieve all
  my @kanji_members        = $keyaki->team_members('kanji');
  my @hiragana_members     = $keyaki->team_members('hiragana');

  # retrieve the members under some conditions
  my @sorted_by_age        = $keyaki->sort('age', 'asc');
  my @sorted_by_class      = $keyaki->sort('class','desc');
  my @selected_by_age      = $keyaki->select('age', 18, '>=');
  my @selected_by_class    = $keyaki->select('class', 2, '==');

=head1 DESCRIPTION

"Keyakizaka46" is a Japanese famous idol group.
This module, Acme::Keyakizaka46, provides an easy method to catch up
with Keyakizaka46.

=head1 METHODS

=head2 new

=over 4

  my $keyaki = Acme::Keyakizaka46->new;

Creates and returns a new Acme::Keyakizaka46 object.

=back

=head2 members ( $type )

=over 4

  # $type can be one of the values below:
  #  + kanji               : kanji Keyaki members
  #  + hiragana            : hiragana Keyaki members
  #  + undef               : all members

  my @members = $keyaki->team_members('kanji');

Returns the members as a list of the L<Acme::Keyakizaka46::Base>
based object represents each member. See also the documentation of
L<Acme::Keyakizaka46::Base> for more details.

=back

=head2 sort ( $type, $order [ , @members ] )

=over 4

  # $type can be one of the values below:
  #  + age   :  sort by age
  #  + class :  sort by class
  #
  # $order can be a one of the values below:
  #  + desc                :  sort in descending order
  #  + asc (anything else) :  sort in ascending order

  my @sorted_members = $keyaki->sort('age','desc'); # sort by age in descending order

Returns the members sorted by the I<$type> field.

=back

=head2 select ( $type, $number, $operator [, @members] )

=over 4

  # $type can be one of the same values above:
  my @selected_members = $keyaki->select('age', 18, '>=');

Returns the members satisfy the given I<$type> condition. I<$operator>
must be a one of '==', '>=', '<=', '>', and '<'. This method compares
the given I<$type> to the member's one in the order below:

  $number $operator $member_value

=back

=head1 SEE ALSO

=over 4

=item * Keyakizaka46 (Official Site)

L<http://www.keyakizaka46.com/>

=item * Acme::Nogizaka46

L<http://search.cpan.org/~twogmon/Acme-Nogizaka46-0.3/lib/Acme/Nogizaka46.pm>

=back

=head1 AUTHOR

Okawara Ayato E<lt>2044taiga@gmail.comE<gt>

=head1 LICENSE

Copyright (C) Okwara Ayato.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut



( run in 1.430 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )