From: Matt S Trout Date: Wed, 30 Nov 2005 18:18:30 +0000 (+0000) Subject: Added improved Schema load_classes syntax from abraxxa X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5ce32fc1a062a68cccb45863164f65326b69adb9;p=dbsrgits%2FDBIx-Class-Historic.git Added improved Schema load_classes syntax from abraxxa --- diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 1c864ea..85c2db6 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -85,28 +85,60 @@ sub registered_classes { return values %{shift->class_registrations}; } -=item load_classes [} +=item load_classes [, (, ), { => []}] Uses L to find all classes under the database class' namespace, or uses the classes you select. Then it loads the component (using L), and registers them (using B); +It is possible to comment out classes with a leading '#', but note that perl +will think it's a mistake (trying to use a comment in a qw list) so you'll +need to add "no warnings 'qw';" before your load_classes call. + =cut sub load_classes { - my $class = shift; - my @comp = grep { $_ !~ /^#/ } @_; - unless (@comp) { + my ($class, @params) = @_; + + my %comps_for; + + if (@params) { + foreach my $param (@params) { + if (ref $param eq 'ARRAY') { + # filter out commented entries + my @modules = grep { $_ !~ /^#/ } @$param; + + push (@{$comps_for{$class}}, @modules); + } + elsif (ref $param eq 'HASH') { + # more than one namespace possible + for my $comp ( keys %$param ) { + # filter out commented entries + my @modules = grep { $_ !~ /^#/ } @{$param->{$comp}}; + + push (@{$comps_for{$comp}}, @modules); + } + } + else { + # filter out commented entries + push (@{$comps_for{$class}}, $param) if $param !~ /^#/; + } + } + } else { eval "require Module::Find;"; $class->throw("No arguments to load_classes and couldn't load". " Module::Find ($@)") if $@; - @comp = map { substr $_, length "${class}::" } - Module::Find::findallmod($class); + my @comp = map { substr $_, length "${class}::" } Module::Find::findallmod($class); + $comps_for{$class} = \@comp; } - foreach my $comp (@comp) { - my $comp_class = "${class}::${comp}"; - eval "use $comp_class"; # If it fails, assume the user fixed it - $class->register_class($comp => $comp_class); + + foreach my $prefix (keys %comps_for) { + foreach my $comp (@{$comps_for{$prefix}||[]}) { + my $comp_class = "${prefix}::${comp}"; + print "$comp_class\n"; + eval "use $comp_class"; # If it fails, assume the user fixed it + $class->register_class($comp => $comp_class); + } } } diff --git a/t/lib/DBICTest/Schema.pm b/t/lib/DBICTest/Schema.pm index 2a94ce9..dc4002e 100644 --- a/t/lib/DBICTest/Schema.pm +++ b/t/lib/DBICTest/Schema.pm @@ -2,7 +2,27 @@ package DBICTest::Schema; use base qw/DBIx::Class::Schema/; +no warnings qw/qw/; + __PACKAGE__->load_classes(qw/ - Artist CD Track Tag LinerNotes OneKey TwoKeys FourKeys SelfRef SelfRefAlias /); + Artist + CD + #dummy + Track + Tag + /, + { 'DBICTest::Schema' => [qw/ + LinerNotes + OneKey + #dummy + TwoKeys + /]}, + ( + 'FourKeys', + '#dummy', + 'SelfRef', + ), + qw/SelfRefAlias/ +); 1;