X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FRole%2FTiny.pm;h=b034790f635ba0ef8a675445249ac336ccd94f0d;hb=ed1d913d2c76d5a412083fe6e4a3cd3d313f9aed;hp=72a0a28f0896d4902498fde9fb260cd5739e3e2a;hpb=794243b9b78b15e60d9cffc024afeaaaca620614;p=gitmo%2FRole-Tiny.git diff --git a/lib/Role/Tiny.pm b/lib/Role/Tiny.pm index 72a0a28..b034790 100644 --- a/lib/Role/Tiny.pm +++ b/lib/Role/Tiny.pm @@ -6,7 +6,7 @@ sub _getstash { \%{"$_[0]::"} } use strict; use warnings FATAL => 'all'; -our $VERSION = '1.003002'; # 1.3.2 +our $VERSION = '1.003002'; $VERSION = eval $VERSION; our %INFO; @@ -100,8 +100,9 @@ sub apply_roles_to_object { my ($me, $object, @roles) = @_; die "No roles supplied!" unless @roles; my $class = ref($object); - bless($object, $me->create_class_with_roles($class, @roles)); - $object; + # on perl < 5.8.9, magic isn't copied to all ref copies. bless the parameter + # directly, so at least the variable passed to us will get any magic applied + bless($_[1], $me->create_class_with_roles($class, @roles)); } my $role_suffix = 'A000'; @@ -361,9 +362,23 @@ sub _install_methods { foreach my $i (grep !exists $has_methods{$_}, keys %$methods) { no warnings 'once'; - *{_getglob "${to}::${i}"} = $methods->{$i}; + my $glob = _getglob "${to}::${i}"; + *$glob = $methods->{$i}; + + # overloads using method names have the method stored in the scalar slot + # and &overload::nil in the code slot. + next + unless $i =~ /^\(/ + && defined &overload::nil + && $methods->{$i} == \&overload::nil; + + my $overload = ${ *{_getglob "${role}::${i}"}{SCALAR} }; + next + unless defined $overload; + + *$glob = \$overload; } - + $me->_install_does($to); } @@ -504,9 +519,6 @@ a method since this conflict indicates a potential problem. =head1 IMPORTED SUBROUTINES -In addition to importing subroutines, using C applies L and -L to the caller. - =head2 requires requires qw(foo bar); @@ -566,6 +578,15 @@ L is lazily loaded and we do not declare it as a dependency. If your L role uses modifiers you must depend on both L and L. +=head2 Strict and Warnings + +In addition to importing subroutines, using C applies L and +L to the caller. It's possible to +disable these if desired: + + use Role::Tiny; + use warnings NONFATAL => 'all'; + =head1 SUBROUTINES =head2 does_role @@ -619,17 +640,20 @@ New class is returned. Returns true if the given package is a role. +=head1 CAVEATS + +=over 4 + +=item * On perl 5.8.8 and earlier, applying a role to an object won't apply any +overloads from the role to all copies of the object. + =head1 SEE ALSO L is the attribute-less subset of L; L is a meta-protocol-less subset of the king of role systems, L. -If you don't want method modifiers and do want to be forcibly restricted -to a single role application per class, Ovid's L exists. But -Stevan Little (the L author) and I don't find the additional -restrictions to be amazingly helpful in most cases; L's choices -are more a guide to what you should prefer doing, to our mind, rather than -something that needs to be enforced. +Ovid's L provides roles with a similar scope, but without method +modifiers, and having some extra usage restrictions. =head1 AUTHOR @@ -661,6 +685,8 @@ ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) tobyink - Toby Inkster (cpan:TOBYINK) +haarg - Graham Knop (cpan:HAARG) + =head1 COPYRIGHT Copyright (c) 2010-2012 the Role::Tiny L and L