From: Brian Phillips Date: Tue, 9 Feb 2010 18:38:44 +0000 (-0600) Subject: validate class/component loader options X-Git-Tag: 0.05002~6 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c634fde989b2694edb650f37a3aed6747e94c02d;p=dbsrgits%2FDBIx-Class-Schema-Loader.git validate class/component loader options --- diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index cd2018c..2a210fe 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -143,11 +143,45 @@ sub loader_options { my $self = shift; my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_; + $self->_validate_loader_options(\%args); $self->_loader_args(\%args); $self; } +sub _validate_loader_options { + my $self = shift; + my $args = shift; + + my @class_keys = qw( + schema_base_class result_base_class additional_base_classes + left_base_classes additional_classes components resultset_components + ); + foreach my $k ( grep { exists $args->{$_} } @class_keys ) { + my @classes = ref( $args->{$k} ) eq 'ARRAY' ? @{ $args->{$k} } : $args->{$k}; + foreach my $c (@classes) { + + # components default to being under the DBIx::Class namespace unless they + # are preceeded with a '+' + if ( $k =~ m/components$/ && $c !~ s/^\+// ) { + $c = 'DBIx::Class::' . $c; + } + + # 1 == installed, 0 == not installed, undef == invalid classname + my $installed = Class::Inspector->installed($c); + if ( defined($installed) ) { + if ( $installed == 0 ) { + croak qq/$c, as specified in the loader option "$k", is not installed/; + } + } else { + croak qq/$c, as specified in the loader option "$k", is an invalid class name/; + } + } + } + + return; +} + sub _invoke_loader { my $self = shift; my $class = ref $self || $self; diff --git a/t/23dumpmore.t b/t/23dumpmore.t index 57bd206..c0da742 100644 --- a/t/23dumpmore.t +++ b/t/23dumpmore.t @@ -372,6 +372,18 @@ do_dump_test( ], }, ); +eval { + do_dump_test( + classname => 'DBICTest::DumpMore::1', + options => { + use_namespaces => 1, + result_base_class => 'My::MissingResultBaseClass', + }, + ); +}; +ok($@, "exception thrown on bad result_base_class"); +like($@, qr/My::MissingResultBaseClass.*is not installed/, "user-friend error message on missing result_base_class" ); + done_testing;