Switch to unshifting message if needed, like most of Moose
[gitmo/Moose.git] / lib / Moose / Util.pm
index 63a4da5..2658ec8 100644 (file)
@@ -3,6 +3,7 @@ package Moose::Util;
 use strict;
 use warnings;
 
+use Class::Load 0.07 qw(load_class load_first_existing_class);
 use Data::OptList;
 use Params::Util qw( _STRING );
 use Sub::Exporter;
@@ -28,6 +29,7 @@ my @exports = qw[
     english_list
     meta_attribute_alias
     meta_class_alias
+    throw
 ];
 
 Sub::Exporter::setup_exporter({
@@ -122,7 +124,7 @@ sub _apply_all_roles {
             $meta = $role->[0];
         }
         else {
-            Class::MOP::load_class( $role->[0] , $role->[1] );
+            load_class( $role->[0] , $role->[1] );
             $meta = find_meta( $role->[0] );
         }
 
@@ -142,7 +144,7 @@ sub _apply_all_roles {
 
     return unless @role_metas;
 
-    Class::MOP::load_class($applicant)
+    load_class($applicant)
         unless blessed($applicant)
             || Class::MOP::class_of($applicant);
 
@@ -215,7 +217,7 @@ sub _build_alias_package_name {
             $type, $metaclass_name, $options{trait}
         );
 
-        my $loaded_class = Class::MOP::load_first_existing_class(
+        my $loaded_class = load_first_existing_class(
             $possible_full_name,
             $metaclass_name
         );
@@ -307,12 +309,14 @@ sub meta_class_alias {
 
 # XXX - this should be added to Params::Util
 sub _STRINGLIKE0 ($) {
-    return _STRING( $_[0] )
-        || ( defined $_[0]
-        && $_[0] eq q{} )
-        || ( blessed $_[0]
-        && overload::Method( $_[0], q{""} )
-        && length "$_[0]" );
+    return 1 if _STRING( $_[0] );
+    if ( blessed $_[0] ) {
+        return overload::Method( $_[0], q{""} );
+    }
+
+    return 1 if defined $_[0] && $_[0] eq q{};
+
+    return 0;
 }
 
 sub _reconcile_roles_for_metaclass {
@@ -467,6 +471,34 @@ sub _is_role_only_subclass {
     return 1;
 }
 
+sub throw {
+    if (@_ % 2) {
+        unshift @_, 'message';
+    }
+
+    my %args = @_;
+
+    my $superclass = delete($args{superclass}) || 'Throwable::Error';
+    my $roles = delete($args{roles});
+
+    my $metaclass;
+
+    load_class($superclass);
+
+    if ($roles) {
+        $metaclass = Moose::Meta::Class->create_anon_class(
+            superclasses => [$superclass],
+            roles        => $roles,
+        );
+    }
+    else {
+        $metaclass = Moose::Meta::Class->initialize($superclass);
+    }
+
+    $metaclass->name->throw(\%args);
+}
+
+
 1;
 
 # ABSTRACT: Utilities for working with Moose classes
@@ -533,7 +565,7 @@ each of which can be followed by an optional hash reference of options
 
 =item B<ensure_all_roles($applicant, @roles)>
 
-This function is similar to L</apply_all_roles>, but only applies roles that
+This function is similar to C<apply_all_roles>, but only applies roles that
 C<$applicant> does not already consume.
 
 =item B<with_traits($class_name, @role_names)>