X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FRole%2FTiny.pm;h=07fb3d44cbde003db625eb13f2434ae3d8a7b972;hb=cca4fd3e2b7ba5b6b6bd615d4f46ae2aefffd27b;hp=67e5c05c6a2897ccee7d3e36bf768d31398117f4;hpb=3f9b723f98c8af029f9da06e9dcd63b98e782b91;p=gitmo%2FRole-Tiny.git diff --git a/lib/Role/Tiny.pm b/lib/Role/Tiny.pm index 67e5c05..07fb3d4 100644 --- a/lib/Role/Tiny.pm +++ b/lib/Role/Tiny.pm @@ -13,11 +13,13 @@ our %INFO; our %APPLIED_TO; our %COMPOSED; our %COMPOSITE_INFO; +our @ON_ROLE_CREATE; # Module state workaround totally stolen from Zefram's Module::Runtime. BEGIN { *_WORK_AROUND_BROKEN_MODULE_STATE = "$]" < 5.009 ? sub(){1} : sub(){0}; + *_MRO_MODULE = "$]" < 5.010 ? sub(){"MRO/Compat.pm"} : sub(){"mro.pm"}; } sub Role::Tiny::__GUARD__::DESTROY { @@ -71,6 +73,7 @@ sub import { @{$INFO{$target}{not_methods}={}}{@not_methods} = @not_methods; # a role does itself $APPLIED_TO{$target} = { $target => undef }; + $_->($target) for @ON_ROLE_CREATE; } sub role_application_steps { @@ -143,16 +146,12 @@ sub create_class_with_roles { die "${role} is not a Role::Tiny" unless $me->is_role($role); } - if ($] >= 5.010) { - require mro; - } else { - require MRO::Compat; - } + require(_MRO_MODULE); my $composite_info = $me->_composite_info_for(@roles); my %conflicts = %{$composite_info->{conflicts}}; if (keys %conflicts) { - my $fail = + my $fail = join "\n", map { "Method name conflict for '$_' between roles " @@ -203,7 +202,7 @@ sub apply_roles_to_package { delete @conflicts{@have}; if (keys %conflicts) { - my $fail = + my $fail = join "\n", map { "Due to a method name conflict between roles " @@ -432,11 +431,7 @@ sub _install_does { sub does_role { my ($proto, $role) = @_; - if ($] >= 5.010) { - require mro; - } else { - require MRO::Compat; - } + require(_MRO_MODULE); foreach my $class (@{mro::get_linear_isa(ref($proto)||$proto)}) { return 1 if exists $APPLIED_TO{$class}{$role}; } @@ -449,6 +444,7 @@ sub is_role { } 1; +__END__ =encoding utf-8 @@ -534,7 +530,7 @@ Declares a list of methods that must be defined to compose role. Composes another role into the current role (or class via L). If you have conflicts and want to resolve them in favour of Some::Role1 you -can instead write: +can instead write: with 'Some::Role1'; with 'Some::Role2'; @@ -647,17 +643,15 @@ Returns true if the given package is a role. =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. +=back + =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