The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package BookDB::Schema::Result::Book;

use Moose;

use base 'DBIx::Class';

# following attribute is non useful, since it does
# nothing that persists, but shows how you could
# do something more complicated
has 'comment' => ( isa => 'Str|Undef', is => 'rw',
  trigger => \&set_extra );

sub set_extra
{
   my ($self, $value) = @_;
   $self->extra($value);
}


BookDB::Schema::Result::Book->load_components("Core");
BookDB::Schema::Result::Book->table("book");
BookDB::Schema::Result::Book->add_columns(
  "id",
  { data_type => "INTEGER", is_nullable => 0, size => undef },
  "isbn",
  { data_type => "varchar", is_nullable => 0, size => 100 },
  "title",
  { data_type => "varchar", is_nullable => 0, size => 100,
    extra => { field_def => { type => 'TextArea', size => '64', temp => 'testing' } },
  },
  "publisher",
  { data_type => "varchar", is_nullable => 0, size => 100 },
  "pages",
  { data_type => "INTEGER", is_nullable => 0, size => undef },
  "year",
  { data_type => "INTEGER", is_nullable => 0, size => undef },
  "format",
  {
    data_type => "INTEGER",
    is_foreign_key => 1,
    is_nullable => 0,
    size => undef,
  },
  "borrower",
  {
    data_type => "INTEGER",
    is_foreign_key => 1,
    is_nullable => 0,
    size => undef,
  },
  "borrowed",
  { data_type => "varchar", is_nullable => 0, size => 100 },
  "owner",
  {
    data_type => "INTEGER",
    is_foreign_key => 1,
    is_nullable => 0,
    size => undef,
  },
  "extra",
  { data_type => "varchar", is_nullable => 0, size => 100 },
);
BookDB::Schema::Result::Book->set_primary_key("id");
BookDB::Schema::Result::Book->belongs_to(
  "format",
  "BookDB::Schema::Result::Format",
  { id => "format" },
);
BookDB::Schema::Result::Book->belongs_to(
  "borrower",
  "BookDB::Schema::Result::Borrower",
  { id => "borrower" },
);
BookDB::Schema::Result::Book->belongs_to(
  "owner",
  "BookDB::Schema::Result::User",
  { user_id => "owner" },
);
BookDB::Schema::Result::Book->has_many(
  "books_genres",
  "BookDB::Schema::Result::BooksGenres",
  { "foreign.book_id" => "self.id" },
);
BookDB::Schema::Result::Book->many_to_many(
  genres => 'books_genres', 'genre'
);
__PACKAGE__->has_many(
  "book_authors",
  "BookDB::Schema::Result::AuthorBooks",
  { "foreign.book_id" => "self.id" },
);
__PACKAGE__->many_to_many(
  authors => 'book_authors', 'author'
);
__PACKAGE__->add_unique_constraint( 'isbn' => ['isbn'] );

sub author_list {
    my $self = shift;
    my @authors = $self->authors->all;
    my @author_names;
    foreach my $author (@authors) {
        push @author_names, $author->name;
    }
    return join(', ', @author_names);
}

1;