X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FUtils.pm;h=c6710b24be234146761227eb73b6b2d10eefa169;hb=f9b6d6122c224d2a46e1bcc4f0c98b16d0db21ce;hp=3a0974b2088c414aa43cdab0cdb873e3fea8efd7;hpb=a88c7ec8a3a92fdf966dce0026d06082a10c7714;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Utils.pm b/lib/Catalyst/Utils.pm index 3a0974b..c6710b2 100644 --- a/lib/Catalyst/Utils.pm +++ b/lib/Catalyst/Utils.pm @@ -6,6 +6,7 @@ use File::Spec; use HTTP::Request; use Path::Class; use URI; +use Class::Inspector; =head1 NAME @@ -210,9 +211,65 @@ sub request { return $request; } +=head2 ensure_class_loaded($class_name) + +Loads the class unless it already has been loaded. + +=cut + +sub ensure_class_loaded { + my $class = shift; + + return if Class::Inspector->loaded( $class ); # if a symbol entry exists we don't load again + + # this hack is so we don't overwrite $@ if the load did not generate an error + my $error; + { + local $@; + eval "require $class"; + $error = $@; + } + + die $error if $error; + die "require $class was successful but the package is not defined" + unless Class::Inspector->loaded($class); + + return 1; +} + +=head2 merge_hashes($hashref, $hashref) + +Base code to recursively merge two hashes together with right-hand precedence. + +=cut + +sub merge_hashes { + my ( $lefthash, $righthash ) = @_; + + return $lefthash unless defined $righthash; + + my %merged = %$lefthash; + for my $key ( keys %$righthash ) { + my $right_ref = ( ref $righthash->{ $key } || '' ) eq 'HASH'; + my $left_ref = ( ( exists $lefthash->{ $key } && ref $lefthash->{ $key } ) || '' ) eq 'HASH'; + if( $right_ref and $left_ref ) { + $merged{ $key } = merge_hashes( + $lefthash->{ $key }, $righthash->{ $key } + ); + } + else { + $merged{ $key } = $righthash->{ $key }; + } + } + + return \%merged; +} + + =head1 AUTHOR Sebastian Riedel, C +Yuval Kogman, C =head1 COPYRIGHT