package Acme::PrettyCure::Girl::Role;
use utf8;
use Moo::Role;
use Encode;
use Furl;
use Cache::LRU;
use Net::DNS::Lite;
use Imager;
$Net::DNS::Lite::CACHE = Cache::LRU->new(size => 256);
requires qw(human_name precure_name challenge image_url);
has 'is_precure' => (
is => 'rw',
isa => sub { die "$_[0] is not a boolean" if $_[0] !~ /^[01]$/ },
default => sub {0}
);
sub say {
my ($self, $text) = @_;
my $color = $self->color;
if ( defined $color ) {
print "\e[38;5;${color}m";
}
print encode_utf8("$text\n");
if ( defined $color ) {
print "\e[0m";
}
}
sub color { undef }
sub name {
my $self = shift;
return $self->is_precure ? $self->precure_name : $self->human_name;
}
sub transform {
my ($self, $buddy) = @_;
die "already transformed" if $self->is_precure;
$self->is_precure(1);
$self->say($_) for $self->challenge;
return $self;
}
sub image {
my $self = shift;
my $furl = Furl::HTTP->new(
agent => 'Acme-PrettyCure',
inet_aton => \&Net::DNS::Lite::inet_aton,
timeout => 60,
);
my ( $minor_version, $status, $message, $headers, $content ) =
$furl->request( method => 'GET', url => $self->image_url, );
my $img = Imager->new();
my $type;
if ($self->image_url =~ /\.gif$/) {
$type = 'gif';
}
elsif ($self->image_url =~ /\.png$/) {
$type = 'png';
}
elsif ($self->image_url =~ /\.jpe?g$/) {
$type = 'jpeg';
}
$img->read(data => $content, type => $type) or die $img->errstr;
open my $ah, '|-', qw/aview -reverse -driver curses/ or die "aview:$!";
$img->write( fh => $ah, type => 'pnm' ) or die $img->errstr;
close($ah);
}
1;
__END__
=head1 NAME
Acme::PrettyCure::Girl::Role
=head1 SYNOPSIS
my ($tsubomi,) = Acme::PrettyCure->girls('HeartCatch');
say $tsubomi->name;
$tsubomi->transform;
say $tsubomi->name;
=head1 DESCRIPTION
Pretty Cure Girls.
=head1 METHODS
=head2 name
return her name. if she transformed, return precure name.
=head2 transform
return girl can transform.
=head2 attributes
- human_name
- precure_name
- (fairy_name)
- birthday
- age
- blood_type
=head1 AUTHOR
Kan Fushihara E<lt>kan.fushihara at gmail.comE<gt>
=head1 SEE ALSO
C<Acme::MorningMusume>, C<Acme::AKB48>
=head1 LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut