package Catalyst::Role::AutoCRUD;

use Moose::Role;
use namespace::autoclean;

use CatalystX::InjectComponent;

BEGIN {
  $Catalyst::Plugin::AutoCRUD::VERSION = '1.112770';
}

after 'setup_components' => sub {
    my $class = shift;

    if (exists $class->config->{'Model::AutoCRUD::DBIC'}) {

        my $p = 'Model::AutoCRUD::DBIC';

        # on the fly schema engineering
        if (!exists $class->config->{$p}->{schema_class}) {
            require DBIx::Class::Schema::Loader;
            die "Must have DBIx::Class::Schema::Loader version > 0.04005"
                if eval "$DBIx::Class::Schema::Loader::VERSION" <= 0.04005;

            DBIx::Class::Schema::Loader::make_schema_at(
                'AutoCRUD::Loader::Schema', {},
                $class->config->{$p}->{connect_info},
            );

            eval q{
                package # hide from the PAUSE
                    AutoCRUD::Loader::Schema;
                use base 'DBIx::Class::Schema';
                AutoCRUD::Loader::Schema->load_classes();
                1;
            };
            $INC{'AutoCRUD/Loader/Schema.pm'} = 'loaded';

            $class->config->{$p}->{schema_class} = 'AutoCRUD::Loader::Schema';
        }

        CatalystX::InjectComponent->inject(
            into => $class,
            component => "Catalyst::Plugin::AutoCRUD::Model::DBIC",
            as => 'AutoCRUD::DBIC'
        );
    }

    # bodge the config for chained PathPart so the user can use our basepath
    # shortcut in their config, which is less verbose than Cat's alternative
    if (exists $class->config->{AutoCRUD}
        and exists $class->config->{AutoCRUD}->{basepath}) {
        $class->config->{'Controller::AutoCRUD::Root'}->{action}->{base}->{PathPart}
            = $class->config->{AutoCRUD}->{basepath};
    }


    foreach(qw! Root Static AJAX Skinny !){
        CatalystX::InjectComponent->inject(
            into => $class,
            component => "Catalyst::Plugin::AutoCRUD::Controller::".$_,
            as => 'AutoCRUD::'.$_
        );
    }

    foreach(qw! Metadata::DBIC Backend::DBIC !){
        CatalystX::InjectComponent->inject(
            into => $class,
            component => "Catalyst::Plugin::AutoCRUD::Model::".$_,
            as => 'AutoCRUD::'.$_
        );
    }

    foreach(qw! JSON TT !){
        CatalystX::InjectComponent->inject(
            into => $class,
            component => "Catalyst::Plugin::AutoCRUD::View::".$_,
            as => 'AutoCRUD::'.$_
        );
    }

};


1;
