validate class/component loader options
Brian Phillips [Tue, 9 Feb 2010 18:38:44 +0000 (12:38 -0600)]
lib/DBIx/Class/Schema/Loader.pm
t/23dumpmore.t

index cd2018c..2a210fe 100644 (file)
@@ -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;
index 57bd206..c0da742 100644 (file)
@@ -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;