use strict;
use warnings;
package # hide from PAUSE
Author;
use Moo;
use autobox::Core;
has name => ( is => "lazy" );
has publisher => ( is => "lazy" );
has books => ( is => "lazy" );
sub _build_books { [] }
sub publisher_affiliation {
my $self = shift;
my ($of) = @_;
return $self->name . " $of " . $self->publisher->name;
}
sub is_prolific {
my $self = shift;
return $self->books->length > 1;
}
package # hide from PAUSE
Book;
use Moo;
has title => ( is => "lazy" );
has genre => ( is => "lazy" );
has page_count => ( is => "lazy" );
has price => ( is => "lazy" );
sub _build_price { 10 }
has author => ( is => "rw", weak_ref => 1 );
sub price_with_tax {
my $self = shift;
my ($tax_percent) = @_;
return $self->price + ( $self->price * $tax_percent );
}
package # hide from PAUSE
Publisher;
use Moo;
has name => ( is => "lazy" );
sub _build_authors { [] }
package # hide from PAUSE
Literature;
use autobox::Core;
sub literature {
my $p_orbit = Publisher->new({ name => "Orbit" });
my $p_zeus = Publisher->new({ name => "Head of Zeus" });
my $p_gollancz = Publisher->new({ name => "Gollanz" });
# Corey
my $b_leviathan = Book->new({
title => "Leviathan Wakes",
genre => "Sci-fi",
page_count => 342,
price => 6,
});
my $b_caliban = Book->new({
title => "Caliban's War",
genre => "Sci-fi",
page_count => 430,
price => 6,
});
# Liu
my $b_three = Book->new({
title => "The Tree-Body Problem",
genre => "Sci-fi",
page_count => 400,
price => 5,
});
# Rothfuss
my $b_wind = Book->new({
title => "The Name of the Wind",
genre => "Fantasy",
page_count => 676,
price => 8,
});
my $a_corey = Author->new({
name => "James A. Corey",
publisher => $p_orbit,
books => [ $b_leviathan, $b_caliban ],
});
my $a_liu = Author->new({
name => "Cixin Liu",
publisher => $p_zeus,
books => [ $b_three ],
});
my $a_rothfuss = Author->new({
name => "Patrick Rothfuss",
publisher => $p_gollancz,
books => [ $b_wind ],
});
my $literature = {
books => ( my $books = [ $b_leviathan, $b_caliban, $b_three, $b_wind ] ),
authors => ( my $authors = [ $a_corey, $a_liu, $a_rothfuss ] ),
publishers => ( my $publishers = [ $p_orbit, $p_zeus, $p_gollancz ] ),
};
for my $author (@$authors) {
$_->author( $author ) for ( $author->books->elements );
}
return $literature;
}
1;