Do not call component_base_class unless it is actually necessary
[p5sagit/Class-C3-Componentised.git] / lib / Class / C3 / Componentised.pm
index d1d48ba..5d8c73b 100644 (file)
@@ -46,7 +46,7 @@ use MRO::Compat;
 use Class::Inspector;
 use Carp;
 
-our $VERSION = 1.0003;
+our $VERSION = 1.0005;
 
 =head2 load_components( @comps )
 
@@ -60,14 +60,18 @@ Calling this will call C<Class::C3::reinitialize>.
 
 sub load_components {
   my $class = shift;
-  my $base = $class->component_base_class;
-  my @comp = map { /^\+(.*)$/ ? $1 : "${base}::$_" } grep { $_ !~ /^#/ } @_;
+  my @comp = map {
+              /^\+(.*)$/
+                ? $1
+                : join ('::', $class->component_base_class, $_)
+             }
+             grep { $_ !~ /^#/ } @_;
   $class->_load_components(@comp);
 }
 
 =head2 load_own_components( @comps )
 
-Simialr to L<load_components>, but assumes every class is C<"$class::$comp">.
+Similar to L<load_components>, but assumes every class is C<"$class::$comp">.
 
 =cut
 
@@ -95,9 +99,12 @@ found.
 
 sub load_optional_components {
   my $class = shift;
-  my $base = $class->component_base_class;
   my @comp = grep { $class->load_optional_class( $_ ) }
-             map { /^\+(.*)$/ ? $1 : "${base}::$_" } 
+             map {
+              /^\+(.*)$/
+                ? $1
+                : join ('::', $class->component_base_class, $_)
+             }
              grep { $_ !~ /^#/ } @_;
 
   $class->_load_components( @comp ) if scalar @comp;
@@ -168,6 +175,32 @@ sub inject_base {
   mro::set_mro($target, 'c3');
 }
 
+=head2 load_optional_class
+
+Returns a true value if the specified class is installed and loaded
+successfully, throws an exception if the class is found but not loaded
+successfully, and false if the class is not installed
+
+=cut
+
+sub load_optional_class {
+  my ($class, $f_class) = @_;
+  eval { $class->ensure_class_loaded($f_class) };
+  my $err = $@;   # so we don't lose it
+  if (! $err) {
+    return 1;
+  }
+  else {
+    my $fn = (join ('/', split ('::', $f_class) ) ) . '.pm';
+    if ($err =~ /Can't locate ${fn} in \@INC/ ) {
+      return 0;
+    }
+    else {
+      die $err;
+    }
+  }
+}
+
 =head1 AUTHOR
 
 Matt S. Trout and the DBIx::Class team