Make formatting more like the rest of the code
[gitmo/MooseX-Types.git] / lib / MooseX / Types / Combine.pm
index a0fbe34..43aa79f 100644 (file)
@@ -1,11 +1,7 @@
-=head1 NAME
-
-MooseX::Types::Combine - Combine type libraries for exporting
-
-=cut
-
 package MooseX::Types::Combine;
 
+# ABSTRACT: Combine type libraries for exporting
+
 use strict;
 use warnings;
 use Class::MOP ();
@@ -14,7 +10,7 @@ use Class::MOP ();
 
     package CombinedTypeLib;
 
-    use base 'MooseX::Types::Combined';
+    use base 'MooseX::Types::Combine';
 
     __PACKAGE__->provide_types_from(qw/TypeLib1 TypeLib2/);
 
@@ -35,16 +31,26 @@ sub import {
     my ($class, @types) = @_;
     my $caller = caller;
 
-    my @type_libs = $class->provide_types_from;
-    Class::MOP::load_class($_) for @type_libs;
+    my %types = $class->_provided_types;
 
-    my %types = map {
-        my $lib = $_;
-        map +($_ => $lib), $lib->type_names
-    } @type_libs;
+    if ( grep { $_ eq ':all' } @types ) {
+        $_->import( { -into => $caller }, q{:all} )
+            for $class->provide_types_from;
+        return;
+    }
 
     my %from;
-    push @{ $from{ $types{ $_ } } }, $_ for @types;
+    for my $type (@types) {
+        unless ($types{$type}) {
+            my @type_libs = $class->provide_types_from;
+
+            die
+                "$caller asked for a type ($type) which is not found in any of the"
+                . " type libraries (@type_libs) combined by $class\n";
+        }
+
+        push @{ $from{ $types{$type} } }, $type;
+    }
 
     $_->import({ -into => $caller }, @{ $from{ $_ } })
         for keys %from;
@@ -64,11 +70,42 @@ sub provide_types_from {
     my $store =
      do { no strict 'refs'; \@{ "${class}::__MOOSEX_TYPELIBRARY_LIBRARIES" } };
 
-    @$store = @libs if @libs;
+    if (@libs) {
+        $class->_check_type_lib($_) for @libs;
+        @$store = @libs;
+
+        my %types = map {
+            my $lib = $_;
+            map +( $_ => $lib ), $lib->type_names
+        } @libs;
+
+        $class->_provided_types(%types);
+    }
 
     @$store;
 }
 
+sub _check_type_lib {
+    my ($class, $lib) = @_;
+
+    Class::MOP::load_class($lib);
+
+    die "Cannot use $lib in a combined type library, it does not provide any types"
+        unless $lib->can('type_names');
+}
+
+sub _provided_types {
+    my ($class, %types) = @_;
+
+    my $types =
+     do { no strict 'refs'; \%{ "${class}::__MOOSEX_TYPELIBRARY_TYPES" } };
+
+    %$types = %types
+        if keys %types;
+
+    %$types;
+}
+
 =head1 SEE ALSO
 
 L<MooseX::Types>