X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FComponentised.pm;h=ecfe177c55fd1b8f46fe735ef6f2786738b479bc;hb=3d5bd2af0c5545edd47ffbde0d708caf7cffeaea;hp=412958f62e65a5225d5bd99a46f3243b3d46ecd9;hpb=df88a29cfe1085d225c3954b10358c1da8dba7ec;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Componentised.pm b/lib/DBIx/Class/Componentised.pm index 412958f..ecfe177 100644 --- a/lib/DBIx/Class/Componentised.pm +++ b/lib/DBIx/Class/Componentised.pm @@ -6,6 +6,7 @@ use warnings; use Class::C3; use Class::Inspector; +use Carp::Clan qw/^DBIx::Class/; sub inject_base { my ($class, $target, @to_inject) = @_; @@ -58,15 +59,47 @@ sub _load_components { $class->inject_base($class => @comp); } +# Given a class name, tests to see if it is already loaded or otherwise +# defined. If it is not yet loaded, the package is require'd, and an exception +# is thrown if the class is still not loaded. +# # TODO: handle ->has_many('rel', 'Class'...) instead of # ->has_many('rel', 'Some::Schema::Class'...) +# +# BUG: For some reason, packages with syntax errors are added to %INC on +# require sub ensure_class_loaded { my ($class, $f_class) = @_; - eval "require $f_class"; - my $err = $@; - Class::Inspector->loaded($f_class) - or die $err || "require $f_class was successful but the package". - "is not defined"; + return if Class::Inspector->loaded($f_class); + eval "require $f_class"; # require needs a bareword or filename + if ($@) { + if ($class->can('throw_exception')) { + $class->throw_exception($@); + } else { + croak $@; + } + } +} + +# Returns true if the specified class is installed or already loaded, false +# otherwise +sub ensure_class_found { + my ($class, $f_class) = @_; + return Class::Inspector->loaded($f_class) || + Class::Inspector->installed($f_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 +sub load_optional_class { + my ($class, $f_class) = @_; + if ($class->ensure_class_found($f_class)) { + $class->ensure_class_loaded($f_class); + return 1; + } else { + return 0; + } } 1;