The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Catalyst::Helper::Model::Jifty::DBI;

use strict;
use warnings;
use Carp;
use FindBin;
use File::Spec;
use File::Basename;

=head1 NAME

Catalyst::Helper::Model::Jifty::DBI

=head1 SYNOPSIS

  # to create a Catalyst::Model::Jifty::DBI class
  script/app_create.pl model ModelName Jifty::DBI

  # or, if you really want to hard-code your configuration
  script/app_create.pl model ModelName Jifty::DBI Schema::Base database test.db ...

  # to create a JDBI::Record/Collection classes under the Model
  script/create.pl model ModelName::RecordName Jifty::DBI

=head1 BACKWARD INCOMPATIBILITY

Current version of Catalyst::(Helper::)Model::Jifty::DBI was once called Catalyst::(Helper::)Model::JDBI::Schemas, which then replaced the original version written by Marcus Ramberg, by the request of Matt S. Trout (Catalyst Core team) to avoid future confusion. I wonder if anyone used the previous one, but note that APIs have been revamped and backward incompatible since 0.03.

=head1 DESCRIPTION

This helper helps you to create a C::M::Jifty::DBI Model class, and optionally, Jifty::DBI::Record/Collection classes under the Model.

Model class will be created when you run it for the first time. Specify your CatalystApp::Model::Name's basename ("Name" for this case), then, this helper's name (Jifty::DBI).

If you really want to specify schema_base for the model (which is equal to the Model class by default), append that Schema::Base::Name, and the key/value pairs of connect_info hash, too. However, I recommend to use ConfigLoader to avoid hard-coded configuration.

When you set up a Model class, you can create Record/Collection classes. Specify ModelName::RecordName (or Schema::Base::Name), and helper's name. Note that Collection class is created automatically. You don't need to (actually, you shouldn't) specify Collection class name, which is confusing.

=head1 METHODS

=head2 mk_compclass

creates actual Model/Record/Collection classes.

=cut

sub mk_compclass {
  my $self   = shift;
  my $helper = shift;

  my $class = $helper->{class};
  my ($parent) = $class =~ /^(.+)::\w+$/;

  my $parent_pm = dirname( $parent ).'.pm';

  if ( -f $parent_pm && $parent !~ /::M(?:odel)$/i ) {
    # probably this is a subclass, ie. record/collection class

    my $record_file = $helper->{file};

    croak "Probably you are going to create a Record class, ".
          "but your Record class has 'Collection' in the name. ".
          "It's confusing. Please use other name."
          if $record_file =~ /Collection\.pm$/i;

    $helper->render_file( 'recordclass', $record_file );

    my $collection_file = $record_file;
       $collection_file =~ s/\.pm$/Collection.pm/;

    $helper->render_file( 'collectionclass', $collection_file );
  }
  else {
    # this should be the main model class

    $helper->{schema_base} = shift || $helper->{class};

    my %connect_info = ( @_ && ( @_ % 2 ) == 0 ) ? @_ : ();

    $connect_info{database} ||= lc $helper->{prefix}.'.db';
    $connect_info{driver}   ||= 'SQLite';
    $connect_info{host}     ||= 'localhost';

    $helper->{connect_info} = \%connect_info;

    $helper->render_file( 'schemaclass', $helper->{file} );
  }
}

=head1 AUTHOR

Kenichi Ishigaki, E<lt>ishigaki@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2007 by Kenichi Ishigaki.

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

=cut

1;

__DATA__

=begin pod_to_ignore

__schemaclass__
package [% class %]

use strict;
use warnings;
use base 'Catalyst::Model::Jifty::DBI';

#### You can hard-code your configuration here,
#### but you may want to use ConfigLoader
#### to move configuration into config.yaml.
#
#__PACKAGE__->config({
#    schema_base  => [% schema_base %],
#    connect_info => {
#        database => '[% connect_info.database %]',
#        driver   => '[% connect_info.driver %]',
#        host     => '[% connect_info.host %]',
#        user     => '[% connect_info.user %]',
#        password => '[% connect_info.password %]',
#    },
#
#### You may want to use this instead of above connect_info
#### when you want to use multiple databases.
#
#    databases => [
#        {
#            name => '[% connect_info.database %]',
#            connect_info => {
#                database => '[% connect_info.database %]',
#                driver   => '[% connect_info.driver %]',
#                host     => '[% connect_info.host %]',
#                user     => '[% connect_info.user %]',
#                password => '[% connect_info.password %]',
#        },
#    ],
#});

=head1 NAME

[% class %] - Catalyst Jifty::DBI Model

=head1 SYNOPSIS

See L<[% app %]>

=head1 DESCRIPTION

L<Catalyst::Model::Jifty::DBI> Model using schemas under L<[% schema_base %]>.

=head1 AUTHOR

[% author %]

=head1 LICENSE

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

=cut

1;
__recordclass__
package [% class %];

use strict;
use warnings;
use Jifty::DBI::Schema;
use Jifty::DBI::Record schema {

# write your schema here like this:
#
#   column "user_id" => type is "integer", is mandatory;
#   column "text"    => type is "text";
#
# See Jifty/Jifty::DBI's documents/sources/tests for details.
#
# Note that you don't have to provide primary key,
# which would be created by Jifty::DBI automatically.

};

=head1 NAME

[% class %] - Catalyst JDBI Schema/Record

=head1 SYNOPSIS

See L<[% app %]>

=head1 DESCRIPTION

A Record/Schema class for L<Catalyst::Model::Jifty::DBI> Model.

=head1 AUTHOR

[% author %]

=head1 LICENSE

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

=cut

1;
__collectionclass__
package [% class %]Collection;

use strict;
use warnings;
use base 'Jifty::DBI::Collection';

=head1 NAME

[% class %]Collection - Catalyst JDBI Collection

=head1 SYNOPSIS

See L<[% app %]>

=head1 DESCRIPTION

A Collection class for L<Catalyst::Model::Jifty::DBI> Model.

=head1 AUTHOR

[% author %]

=head1 LICENSE

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

=cut

1;