Changes entry for Role::Tiny::With and add chip to CONTRIBUTORS
[gitmo/Role-Tiny.git] / lib / Role / Tiny.pm
index 57028ed..98967e3 100644 (file)
@@ -1,6 +1,7 @@
 package Role::Tiny;
 
 sub _getglob { \*{$_[0]} }
+sub _getstash { \%{"$_[0]::"} }
 
 use strict;
 use warnings FATAL => 'all';
@@ -9,16 +10,21 @@ our %INFO;
 our %APPLIED_TO;
 our %COMPOSED;
 
+# inlined from Moo::_Utils - update that first.
+
 sub _load_module {
-  return 1 if $_[0]->can('can');
   (my $proto = $_[0]) =~ s/::/\//g;
+  return 1 if $INC{"${proto}.pm"};
+  # can't just ->can('can') because a sub-package Foo::Bar::Baz
+  # creates a 'Baz::' key in Foo::Bar's symbol table
+  return 1 if grep !/::$/, keys %{_getstash($_[0])||{}};
   require "${proto}.pm";
   return 1;
 }
 
 sub import {
   my $target = caller;
-  my $me = $_[0];
+  my $me = shift;
   strictures->import;
   return if $INFO{$target}; # already exported into this package
   # get symbol table reference
@@ -84,7 +90,10 @@ sub create_class_with_roles {
 
   die "No roles supplied!" unless @roles;
 
-  my $new_name = join('+', $superclass, my $compose_name = join '+', @roles);
+  my $new_name = join(
+    '__WITH__', $superclass, my $compose_name = join '__AND__', @roles
+  );
+
   return $new_name if $COMPOSED{class}{$new_name};
 
   foreach my $role (@roles) {
@@ -92,7 +101,7 @@ sub create_class_with_roles {
     die "${role} is not a Role::Tiny" unless my $info = $INFO{$role};
   }
 
-  if ($] > 5.010) {
+  if ($] >= 5.010) {
     require mro;
   } else {
     require MRO::Compat;
@@ -242,10 +251,10 @@ else where
 
  package Some::Class;
 
- require Role::Tiny;
+ use Role::Tiny::With;
 
  # bar gets imported, but not foo
- Role::Tiny->apply_role_to_package('Some::Role', __PACKAGE__);
+ with 'Some::Role';
 
  sub foo { ... }
 
@@ -272,6 +281,8 @@ from the role.
 If a method that the role L</requires> to be implemented is not implemented,
 role application will fail loudly.
 
+=back
+
 Unlike L<Class::C3>, where the B<last> class inherited from "wins," role
 composition is the other way around, where first wins.  In a more complete
 system (see L<Moose>) roles are checked to see if they clash.  The goal of this
@@ -283,7 +294,7 @@ is to be much simpler, hence disallowing composition of multiple roles at once.
 
  Role::Tiny->apply_role_to_package('Some::Package', 'Some::Role');
 
-Composes role with package
+Composes role with package.  See also L<Role::Tiny::With>.
 
 =head2 apply_roles_to_object
 
@@ -355,3 +366,12 @@ documentation.
 See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full
 documentation.
 
+=head1 AUTHORS
+
+See L<Moo> for authors.
+
+=head1 COPYRIGHT AND LICENSE
+
+See L<Moo> for the copyright and license.
+
+=cut