Hello community, here is the log from the commit of package perl-Role-Tiny for openSUSE:Factory checked in at 2014-07-28 16:21:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Role-Tiny (Old) and /work/SRC/openSUSE:Factory/.perl-Role-Tiny.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Role-Tiny" Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Role-Tiny/perl-Role-Tiny.changes 2013-10-06 14:56:02.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.perl-Role-Tiny.new/perl-Role-Tiny.changes 2014-07-28 16:21:09.000000000 +0200 @@ -1,0 +2,10 @@ +Mon Jul 28 10:08:32 UTC 2014 - [email protected] + +- updated to 1.003003 + - overloads specified as method names rather than subrefs are now applied + properly + - allow superclass to provide conflicting methods (RT#91054) + - use ->is_role internally to check if a package is a role + - document that Role::Tiny applies strict and fatal warnings + +------------------------------------------------------------------- Old: ---- Role-Tiny-1.003002.tar.gz New: ---- Role-Tiny-1.003003.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Role-Tiny.spec ++++++ --- /var/tmp/diff_new_pack.tsGa6X/_old 2014-07-28 16:21:10.000000000 +0200 +++ /var/tmp/diff_new_pack.tsGa6X/_new 2014-07-28 16:21:10.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package perl-Role-Tiny # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: perl-Role-Tiny -Version: 1.003002 +Version: 1.003003 Release: 0 %define cpan_name Role-Tiny Summary: Roles. Like a nouvelle cuisine portion size slice of Moose. @@ -31,6 +31,7 @@ BuildRequires: perl-macros BuildRequires: perl(Test::Fatal) >= 0.003 BuildRequires: perl(Test::More) >= 0.96 +Recommends: perl(Class::Method::Modifiers) >= 1.05 %{perl_requires} %description ++++++ Role-Tiny-1.003002.tar.gz -> Role-Tiny-1.003003.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/Changes new/Role-Tiny-1.003003/Changes --- old/Role-Tiny-1.003002/Changes 2013-09-05 05:46:05.000000000 +0200 +++ new/Role-Tiny-1.003003/Changes 2014-03-15 21:47:13.000000000 +0100 @@ -1,14 +1,21 @@ Revision history for Role-Tiny -1.003002 2013-09-04 +1.003003 - 2014-03-15 + - overloads specified as method names rather than subrefs are now applied + properly + - allow superclass to provide conflicting methods (RT#91054) + - use ->is_role internally to check if a package is a role + - document that Role::Tiny applies strict and fatal warnings + +1.003002 - 2013-09-04 - abbreviate generated package names if they are longer than perl can handle (RT#83248) - add explicit dependency on the version of Exporter that added 'import' -1.003001 2013-07-14 +1.003001 - 2013-07-14 - fix test accidentally requiring Class::Method::Modifiers -1.003000 2013-07-14 +1.003000 - 2013-07-14 - allow composing roles simultaneously that mutually require each other (RT#82711) - Fix _concrete_methods_of returning non-CODE entries @@ -17,67 +24,67 @@ - add is_role method for checking if a given package is a role - drop minimum perl version - code tests just fine on 5.6.1 and 5.6.2 -1.002005 2013-02-01 +1.002005 - 2013-02-01 - complain loudly if Class::Method::Modifiers is too old (and skip tests) - don't use $_ as loop variable when calling arbitrary code -1.002004 2012-11-02 +1.002004 - 2012-11-02 - remove accidentally-introduced strictures.pm usage -1.002003 2012-10-29 +1.002003 - 2012-10-29 - fix method modifier breakage on 5.10.0 -1.002002 2012-10-28 +1.002002 - 2012-10-28 - skip t/around-does.t when Class::Method::Modifiers is not installed (RT#80310) -1.002001 2012-10-26 +1.002001 - 2012-10-26 - t/does-Moo.t moved to 'xt' (RT#80290) - don't die when looking for 'DOES' on perl < 5.10 (RT#80402) -1.002000 2012-10-19 +1.002000 - 2012-10-19 - load class in addition to roles when using create_class_from_roles - fix module name in Makefile.PL (RT#78591) - when classes consume roles, override their DOES method (RT#79747) - method modifiers can be used for 'does' and 'DOES' -1.001005 2012-07-18 +1.001005 - 2012-07-18 - localize UNIVERSAL::can change to avoid confusing TB2 - properly report roles consumed by superclasses -1.001004 2012-07-12 +1.001004 - 2012-07-12 - remove strictures.pm from the test supplied by mmcleric so we install again - when applying runtime roles include roles from original class in new class ( fixes ::does_role checks) -1.001003 2012-06-19 +1.001003 - 2012-06-19 - correctly apply modifiers with role composition - check for conflicts during role-to-object application (test from mmcleric) - add an explicit return to all exported subs so people don't accidentally rely on the return value - store coderefs as well as their refaddrs to protect against crazy -1.001002 2012-05-05 +1.001002 - 2012-05-05 - alter duplication test to not provoke Class::Method::Modifiers loading -1.001001 2012-04-27 +1.001001 - 2012-04-27 - remove strictures from one last test file -1.001000 2012-04-27 +1.001000 - 2012-04-27 - Documentation improvements, no code changes -1.000_901 2012-04-12 +1.000_901 - 2012-04-12 - Fix MANIFEST inclusion of Role::Basic composition -1.000_900 2012-04-11 +1.000_900 - 2012-04-11 - Add composition with tests stolen from Role::Basic -1.000001 2012-04-03 +1.000001 - 2012-04-03 - Document that Class::Method::Modifiers must be depended on separately - Update tests so that they skip correctly without C::M::M - Add a SEE ALSO section -1.000000 2012-03-29 +1.000000 - 2012-03-29 - Remove redundant code in create_class_with_roles - Minor doc fix to does_role - Split Role::Tiny out into its own dist @@ -94,25 +101,25 @@ - Explicitly require Role::Tiny in Role::Tiny::With (RT#70446) - Fix spurious 'once' warnings under perl -w -0.009013 2011-12-23 +0.009013 - 2011-12-23 - fix up Class::XSAccessor version check to be more robust - improved documentation - fix failures on perls < 5.8.3 - fix test failures on cygwin -0.009012 2011-11-15 +0.009012 - 2011-11-15 - make Method::Generate::Constructor handle $obj->new - fix bug where constants containing a reference weren't handled correctly (ref(\[]) is 'REF' not 'SCALAR', ref(\v1) is 'VSTRING') -0.009011 2011-10-03 +0.009011 - 2011-10-03 - add support for DEMOLISH - add support for BUILDARGS -0.009010 2011-07-20 +0.009010 - 2011-07-20 - missing new files for Role::Tiny::With -0.009009 2011-07-20 +0.009009 - 2011-07-20 - remove the big scary warning because we seem to be mostly working now - perl based getter dies if @_ > 1 (XSAccessor already did) - add Role::Tiny::With for use in classes @@ -120,14 +127,14 @@ subclasses with a BUILD method but no attributes get it honoured - add coerce handling -0.009008 2011-06-03 +0.009008 - 2011-06-03 - transfer fix to _load_module to Role::Tiny and make a note it's an inline - Bring back 5.8.1 compat -0.009007 2011-02-25 +0.009007 - 2011-02-25 - I botched the copyright. re-disting. -0.009006 2011-02-25 +0.009006 - 2011-02-25 - handle non-lazy default and builder when init_arg is undef - add copyright and license info for downstream packagers - weak ref checking for Sub::Quote to avoid bugs on refaddr reuse diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/MANIFEST new/Role-Tiny-1.003003/MANIFEST --- old/Role-Tiny-1.003002/MANIFEST 2013-09-05 05:46:18.000000000 +0200 +++ new/Role-Tiny-1.003003/MANIFEST 2014-03-15 21:47:24.000000000 +0100 @@ -8,13 +8,18 @@ t/around-does.t t/compose-modifiers.t t/concrete-methods.t +t/create-hook.t t/does.t t/lib/Bar.pm t/lib/Baz.pm +t/lib/BrokenModule.pm +t/lib/FalseModule.pm +t/lib/TrackLoad.pm +t/load-module.t t/method-conflicts.t t/modifiers.t t/namespace-clean.t -t/role-basic-00-load.t +t/overload.t t/role-basic-basic.t t/role-basic-bugs.t t/role-basic-composition.t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/META.json new/Role-Tiny-1.003003/META.json --- old/Role-Tiny-1.003002/META.json 2013-09-05 05:46:17.000000000 +0200 +++ new/Role-Tiny-1.003003/META.json 2014-03-15 21:47:24.000000000 +0100 @@ -4,7 +4,7 @@ "mst - Matt S. Trout (cpan:MSTROUT) <[email protected]>" ], "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 6.74, CPAN::Meta::Converter version 2.120921", + "generated_by" : "ExtUtils::MakeMaker version 6.9, CPAN::Meta::Converter version 2.140640", "license" : [ "perl_5" ], @@ -16,20 +16,35 @@ "no_index" : { "directory" : [ "t", - "inc", "xt" ] }, "prereqs" : { "build" : { - "requires" : { - "Test::Fatal" : "0.003", - "Test::More" : "0.96" + "requires" : {} + }, + "configure" : { + "requires" : {} + }, + "develop" : { + "recommends" : { + "Moo" : "0", + "namespace::clean" : "0" } }, "runtime" : { + "recommends" : { + "Class::Method::Modifiers" : "1.05" + }, + "requires" : { + "Exporter" : "5.57", + "perl" : "5.006" + } + }, + "test" : { "requires" : { - "Exporter" : "5.57" + "Test::Fatal" : "0.003", + "Test::More" : "0.96" } } }, @@ -39,11 +54,15 @@ "mailto" : "[email protected]", "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Role-Tiny" }, + "license" : [ + "http://dev.perl.org/licenses/" + ], "repository" : { "type" : "git", "url" : "git://git.shadowcat.co.uk/gitmo/Role-Tiny.git", "web" : "http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Role-Tiny.git" - } + }, + "x_IRC" : "irc://irc.perl.org/#moose" }, - "version" : "1.003002" + "version" : "1.003003" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/META.yml new/Role-Tiny-1.003003/META.yml --- old/Role-Tiny-1.003002/META.yml 2013-09-05 05:46:17.000000000 +0200 +++ new/Role-Tiny-1.003003/META.yml 2014-03-15 21:47:24.000000000 +0100 @@ -3,23 +3,28 @@ author: - 'mst - Matt S. Trout (cpan:MSTROUT) <[email protected]>' build_requires: - Test::Fatal: 0.003 - Test::More: 0.96 + Test::Fatal: '0.003' + Test::More: '0.96' +configure_requires: {} dynamic_config: 1 -generated_by: 'ExtUtils::MakeMaker version 6.74, CPAN::Meta::Converter version 2.120921' +generated_by: 'ExtUtils::MakeMaker version 6.9, CPAN::Meta::Converter version 2.140640' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html - version: 1.4 + version: '1.4' name: Role-Tiny no_index: directory: - t - - inc - xt +recommends: + Class::Method::Modifiers: '1.05' requires: - Exporter: 5.57 + Exporter: '5.57' + perl: '5.006' resources: + IRC: irc://irc.perl.org/#moose bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Role-Tiny + license: http://dev.perl.org/licenses/ repository: git://git.shadowcat.co.uk/gitmo/Role-Tiny.git -version: 1.003002 +version: '1.003003' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/Makefile.PL new/Role-Tiny-1.003003/Makefile.PL --- old/Role-Tiny-1.003002/Makefile.PL 2013-09-05 00:16:25.000000000 +0200 +++ new/Role-Tiny-1.003003/Makefile.PL 2014-03-14 09:14:37.000000000 +0100 @@ -1,45 +1,94 @@ use strict; use warnings FATAL => 'all'; use 5.006; -use ExtUtils::MakeMaker; -(do 'maint/Makefile.PL.include' or die $@) unless -f 'META.yml'; -my %BUILD_DEPS = ( - 'Test::More' => 0.96, - 'Test::Fatal' => 0.003, +my %META = ( + name => 'Role-Tiny', + license => 'perl_5', + prereqs => { + configure => { requires => { + } }, + build => { requires => { + } }, + test => { requires => { + 'Test::More' => 0.96, + 'Test::Fatal' => 0.003, + } }, + runtime => { + requires => { + perl => 5.006, + Exporter => '5.57', + }, + recommends => { + 'Class::Method::Modifiers' => 1.05, + }, + }, + develop => { recommends => { + 'namespace::clean' => 0, + Moo => 0, + } }, + }, + resources => { + # r/w: [email protected]:Role-Tiny.git + repository => { + url => 'git://git.shadowcat.co.uk/gitmo/Role-Tiny.git', + web => 'http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Role-Tiny.git', + type => 'git', + }, + bugtracker => { + mailto => '[email protected]', + web => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Role-Tiny', + }, + x_IRC => 'irc://irc.perl.org/#moose', + license => [ 'http://dev.perl.org/licenses/' ], + }, + no_index => { + directory => [ 't', 'xt' ] + }, ); -# have to do this since old EUMM dev releases miss the eval $VERSION line -my $mymeta = eval($ExtUtils::MakeMaker::VERSION) >= 6.57_02; -my $mymeta_works = eval($ExtUtils::MakeMaker::VERSION) >= 6.57_07; - -WriteMakefile( - NAME => 'Role::Tiny', - VERSION_FROM => 'lib/Role/Tiny.pm', +my %MM_ARGS = ( PREREQ_PM => { - Exporter => '5.57', ($] >= 5.010 ? () : ('MRO::Compat' => 0)), - ($mymeta_works ? () : (%BUILD_DEPS)), - }, - $mymeta_works ? (BUILD_REQUIRES => \%BUILD_DEPS) : (), - ($mymeta && !$mymeta_works ? (NO_MYMETA => 1) : ()), - - -f 'META.yml' ? () : (META_MERGE => { - 'meta-spec' => { version => 2 }, - no_index => { - directory => [ 'xt' ] - }, - resources => { - # r/w: [email protected]:Role-Tiny.git - repository => { - url => 'git://git.shadowcat.co.uk/gitmo/Role-Tiny.git', - web => 'http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo/Role-Tiny.git', - type => 'git', - }, - bugtracker => { - mailto => '[email protected]', - web => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Role-Tiny', - }, - }, - }), + } ); + +############################################################################## +require ExtUtils::MakeMaker; +(do 'maint/Makefile.PL.include' or die $@) unless -f 'META.yml'; + +# have to do this since old EUMM dev releases miss the eval $VERSION line +my $eumm_version = eval $ExtUtils::MakeMaker::VERSION; +my $mymeta = $eumm_version >= 6.57_02; +my $mymeta_broken = $mymeta && $eumm_version < 6.57_07; + +($MM_ARGS{NAME} = $META{name}) =~ s/-/::/g; +($MM_ARGS{VERSION_FROM} = "lib/$MM_ARGS{NAME}.pm") =~ s{::}{/}g; +$MM_ARGS{LICENSE} = $META{license} + if $eumm_version >= 6.30; +$MM_ARGS{NO_MYMETA} = 1 + if $mymeta_broken; +$MM_ARGS{META_ADD} = { 'meta-spec' => { version => 2 }, %META } + unless -f 'META.yml'; + +for (qw(configure build test runtime)) { + my $key = $_ eq 'runtime' ? 'PREREQ_PM' : uc $_.'_REQUIRES'; + my $r = $MM_ARGS{$key} = { + %{$META{prereqs}{$_}{requires}}, + %{delete $MM_ARGS{$key} || {}}, + }; + defined $r->{$_} or delete $r->{$_} for keys %$r; +} + +$MM_ARGS{MIN_PERL_VERSION} = delete $MM_ARGS{PREREQ_PM}{perl} || 0; + +delete $MM_ARGS{MIN_PERL_VERSION} + if $eumm_version < 6.47_01; +$MM_ARGS{BUILD_REQUIRES} = {%{$MM_ARGS{BUILD_REQUIRES}}, %{delete $MM_ARGS{TEST_REQUIRES}}} + if $eumm_version < 6.63_03; +$MM_ARGS{PREREQ_PM} = {%{$MM_ARGS{PREREQ_PM}}, %{delete $MM_ARGS{BUILD_REQUIRES}}} + if $eumm_version < 6.55_01; +delete $MM_ARGS{CONFIGURE_REQUIRES} + if $eumm_version < 6.51_03; + +ExtUtils::MakeMaker::WriteMakefile(%MM_ARGS); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/README new/Role-Tiny-1.003003/README --- old/Role-Tiny-1.003002/README 2013-09-05 05:46:18.000000000 +0200 +++ new/Role-Tiny-1.003003/README 2014-03-15 21:47:24.000000000 +0100 @@ -107,6 +107,14 @@ dependency. If your Role::Tiny role uses modifiers you must depend on both Class::Method::Modifiers and Role::Tiny. + Strict and Warnings + In addition to importing subroutines, using "Role::Tiny" applies strict + and fatal warnings to the caller. It's possible to disable these if + desired: + + use Role::Tiny; + use warnings NONFATAL => 'all'; + SUBROUTINES does_role if (Role::Tiny::does_role($foo, 'Some::Role')) { @@ -154,16 +162,16 @@ Returns true if the given package is a role. +CAVEATS + * 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. + SEE ALSO Role::Tiny is the attribute-less subset of Moo::Role; Moo::Role is a meta-protocol-less subset of the king of role systems, Moose::Role. - If you don't want method modifiers and do want to be forcibly restricted - to a single role application per class, Ovid's Role::Basic exists. But - Stevan Little (the Moose author) and I don't find the additional - restrictions to be amazingly helpful in most cases; Role::Basic'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 Role::Basic provides roles with a similar scope, but without + method modifiers, and having some extra usage restrictions. AUTHOR mst - Matt S. Trout (cpan:MSTROUT) <[email protected]> @@ -194,6 +202,8 @@ tobyink - Toby Inkster (cpan:TOBYINK) <[email protected]> + haarg - Graham Knop (cpan:HAARG) <[email protected]> + COPYRIGHT Copyright (c) 2010-2012 the Role::Tiny "AUTHOR" and "CONTRIBUTORS" as listed above. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/lib/Role/Tiny/With.pm new/Role-Tiny-1.003003/lib/Role/Tiny/With.pm --- old/Role-Tiny-1.003002/lib/Role/Tiny/With.pm 2013-07-22 20:49:26.000000000 +0200 +++ new/Role-Tiny-1.003003/lib/Role/Tiny/With.pm 2014-03-15 21:46:47.000000000 +0100 @@ -2,6 +2,10 @@ use strict; use warnings FATAL => 'all'; + +our $VERSION = '1.003003'; +$VERSION = eval $VERSION; + use Role::Tiny (); use Exporter 'import'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/lib/Role/Tiny.pm new/Role-Tiny-1.003003/lib/Role/Tiny.pm --- old/Role-Tiny-1.003002/lib/Role/Tiny.pm 2013-09-05 05:34:37.000000000 +0200 +++ new/Role-Tiny-1.003003/lib/Role/Tiny.pm 2014-03-15 21:43:55.000000000 +0100 @@ -6,18 +6,20 @@ use strict; use warnings FATAL => 'all'; -our $VERSION = '1.003002'; # 1.3.2 +our $VERSION = '1.003003'; $VERSION = eval $VERSION; 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 { @@ -43,7 +45,7 @@ my $me = shift; strict->import; warnings->import(FATAL => 'all'); - return if $INFO{$target}; # already exported into this package + return if $me->is_role($target); # already exported into this package $INFO{$target}{is_role} = 1; # get symbol table reference my $stash = _getstash($target); @@ -71,6 +73,7 @@ @{$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 { @@ -83,7 +86,7 @@ _load_module($role); die "This is apply_role_to_package" if ref($to); - die "${role} is not a Role::Tiny" unless $INFO{$role}; + die "${role} is not a Role::Tiny" unless $me->is_role($role); foreach my $step ($me->role_application_steps) { $me->$step($to, $role); @@ -100,8 +103,9 @@ 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'; @@ -139,19 +143,15 @@ foreach my $role (@roles) { _load_module($role); - die "${role} is not a Role::Tiny" unless $INFO{$role}; + 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 " @@ -198,9 +198,11 @@ return $me->apply_role_to_package($to, $roles[0]) if @roles == 1; my %conflicts = %{$me->_composite_info_for(@roles)->{conflicts}}; - delete $conflicts{$_} for keys %{ $me->_concrete_methods_of($to) }; + my @have = grep $to->can($_), keys %conflicts; + delete @conflicts{@have}; + if (keys %conflicts) { - my $fail = + my $fail = join "\n", map { "Due to a method name conflict between roles " @@ -210,6 +212,15 @@ die $fail; } + # conflicting methods are supposed to be treated as required by the + # composed role. we don't have an actual composed role, but because + # we know the target class already provides them, we can instead + # pretend that the roles don't do for the duration of application. + my @role_methods = map $me->_concrete_methods_of($_), @roles; + # separate loops, since local ..., delete ... for ...; creates a scope + local @{$_}{@have} for @role_methods; + delete @{$_}{@have} for @role_methods; + # the if guard here is essential since otherwise we accidentally create # a $INFO for something that isn't a Role::Tiny (or Moo::Role) because # autovivification hates us and wants us to die() @@ -327,8 +338,8 @@ sub methods_provided_by { my ($me, $role) = @_; - die "${role} is not a Role::Tiny" unless my $info = $INFO{$role}; - (keys %{$me->_concrete_methods_of($role)}, @{$info->{requires}||[]}); + die "${role} is not a Role::Tiny" unless $me->is_role($role); + (keys %{$me->_concrete_methods_of($role)}, @{$INFO{$role}->{requires}||[]}); } sub _install_methods { @@ -350,9 +361,23 @@ 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); } @@ -385,15 +410,16 @@ my $FALLBACK = sub { 0 }; sub _install_does { my ($me, $to) = @_; - + # only add does() method to classes - return if $INFO{$to}; - + return if $me->is_role($to); + # add does() only if they don't have one *{_getglob "${to}::does"} = \&does_role unless $to->can('does'); - - return if ($to->can('DOES') and $to->can('DOES') != (UNIVERSAL->can('DOES') || 0)); - + + return + if $to->can('DOES') and $to->can('DOES') != (UNIVERSAL->can('DOES') || 0); + my $existing = $to->can('DOES') || $to->can('isa') || $FALLBACK; my $new_sub = sub { my ($proto, $role) = @_; @@ -405,11 +431,7 @@ 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}; } @@ -418,10 +440,11 @@ sub is_role { my ($me, $role) = @_; - return !!$INFO{$role}; + return !!($INFO{$role} && $INFO{$role}{is_role}); } 1; +__END__ =encoding utf-8 @@ -507,7 +530,7 @@ Composes another role into the current role (or class via L<Role::Tiny::With>). 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'; @@ -551,6 +574,15 @@ a dependency. If your L<Role::Tiny> role uses modifiers you must depend on both L<Class::Method::Modifiers> and L<Role::Tiny>. +=head2 Strict and Warnings + +In addition to importing subroutines, using C<Role::Tiny> applies L<strict> and +L<fatal warnings|perllexwarn/Fatal Warnings> to the caller. It's possible to +disable these if desired: + + use Role::Tiny; + use warnings NONFATAL => 'all'; + =head1 SUBROUTINES =head2 does_role @@ -604,17 +636,22 @@ 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. + +=back + =head1 SEE ALSO L<Role::Tiny> is the attribute-less subset of L<Moo::Role>; L<Moo::Role> is a meta-protocol-less subset of the king of role systems, L<Moose::Role>. -If you don't want method modifiers and do want to be forcibly restricted -to a single role application per class, Ovid's L<Role::Basic> exists. But -Stevan Little (the L<Moose> author) and I don't find the additional -restrictions to be amazingly helpful in most cases; L<Role::Basic>'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<Role::Basic> provides roles with a similar scope, but without method +modifiers, and having some extra usage restrictions. =head1 AUTHOR @@ -646,6 +683,8 @@ tobyink - Toby Inkster (cpan:TOBYINK) <[email protected]> +haarg - Graham Knop (cpan:HAARG) <[email protected]> + =head1 COPYRIGHT Copyright (c) 2010-2012 the Role::Tiny L</AUTHOR> and L</CONTRIBUTORS> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/maint/Makefile.PL.include new/Role-Tiny-1.003003/maint/Makefile.PL.include --- old/Role-Tiny-1.003002/maint/Makefile.PL.include 2013-09-03 20:57:26.000000000 +0200 +++ new/Role-Tiny-1.003003/maint/Makefile.PL.include 2014-03-14 09:14:37.000000000 +0100 @@ -1,7 +1,9 @@ BEGIN { -e 'Distar' or system("git clone git://git.shadowcat.co.uk/p5sagit/Distar.git") } use lib 'Distar/lib'; use Distar; -use ExtUtils::MakeMaker 6.68 (); +use ExtUtils::MakeMaker; +ExtUtils::MakeMaker->VERSION(6.68) + unless $ENV{CONTINUOUS_INTEGRATION}; author 'mst - Matt S. Trout (cpan:MSTROUT) <[email protected]>'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/maint/bump-version new/Role-Tiny-1.003003/maint/bump-version --- old/Role-Tiny-1.003002/maint/bump-version 2013-07-15 05:13:41.000000000 +0200 +++ new/Role-Tiny-1.003003/maint/bump-version 2014-03-14 09:14:37.000000000 +0100 @@ -7,6 +7,9 @@ chomp(my $LATEST = qx(grep '^[0-9]' Changes | head -1 | awk '{print \$1}')); my @parts = split /\./, $LATEST; +if (@parts == 2) { + @parts[1,2] = $parts[1] =~ /(\d{1,3})(\d{1,3})/; +} my $OLD_DECIMAL = sprintf('%i.%03i%03i', @parts); @@ -20,17 +23,24 @@ my @new_parts = @parts; $new_parts[$bump_this]++; +$new_parts[$_] = 0 for ($bump_this+1 .. 2); my $NEW_DECIMAL = sprintf('%i.%03i%03i', @new_parts); warn "Bumping $OLD_DECIMAL -> $NEW_DECIMAL\n"; -my $PM_FILE = 'lib/Moo.pm'; +for my $PM_FILE (qw( + lib/Moo.pm + lib/Moo/Role.pm + lib/Sub/Defer.pm + lib/Sub/Quote.pm +)) { + my $file = do { local (@ARGV, $/) = ($PM_FILE); <> }; -my $file = do { local (@ARGV, $/) = ($PM_FILE); <> }; + $file =~ s/(?<=\$VERSION = ')${\quotemeta $OLD_DECIMAL}/${NEW_DECIMAL}/ + or die "unable to bump version number in $PM_FILE"; -$file =~ s/(?<=\$VERSION = ')${\quotemeta $OLD_DECIMAL}/${NEW_DECIMAL}/; + open my $out, '>', $PM_FILE; -open my $out, '>', $PM_FILE; - -print $out $file; + print $out $file; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/concrete-methods.t new/Role-Tiny-1.003003/t/concrete-methods.t --- old/Role-Tiny-1.003002/t/concrete-methods.t 2013-08-27 13:36:59.000000000 +0200 +++ new/Role-Tiny-1.003003/t/concrete-methods.t 2014-03-14 09:14:37.000000000 +0100 @@ -27,8 +27,16 @@ is_deeply([sort keys %$role_methods], ['after_role'], 'only subs after Role::Tiny import are methods' ); +my @role_method_list = Role::Tiny->methods_provided_by('MyRole1'); +is_deeply(\@role_method_list, ['after_role'], + 'methods_provided_by gives method list' ); + my $class_methods = Role::Tiny->_concrete_methods_of('MyClass1'); is_deeply([sort keys %$class_methods], ['method'], 'only subs from non-Role::Tiny packages are methods' ); +like exception { Role::Tiny->methods_provided_by('MyClass1') }, + qr/is not a Role::Tiny/, + 'methods_provided_by refuses to work on classes'; + done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/create-hook.t new/Role-Tiny-1.003003/t/create-hook.t --- old/Role-Tiny-1.003002/t/create-hook.t 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/create-hook.t 2014-03-14 11:28:15.000000000 +0100 @@ -0,0 +1,26 @@ +use strict; +use warnings FATAL => 'all'; +use Test::More; + +use Role::Tiny (); + +my $last_role; +push @Role::Tiny::ON_ROLE_CREATE, sub { + ($last_role) = @_; +}; + +eval q{ + package MyRole; + use Role::Tiny; +}; + +is $last_role, 'MyRole', 'role create hook was run'; + +eval q{ + package MyRole2; + use Role::Tiny; +}; + +is $last_role, 'MyRole2', 'role create hook was run again'; + +done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/lib/BrokenModule.pm new/Role-Tiny-1.003003/t/lib/BrokenModule.pm --- old/Role-Tiny-1.003002/t/lib/BrokenModule.pm 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/lib/BrokenModule.pm 2014-03-14 09:14:37.000000000 +0100 @@ -0,0 +1,6 @@ +package BrokenModule; +use strict; +use warnings; + +my $f = blorp; +1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/lib/FalseModule.pm new/Role-Tiny-1.003003/t/lib/FalseModule.pm --- old/Role-Tiny-1.003002/t/lib/FalseModule.pm 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/lib/FalseModule.pm 2014-03-14 09:14:37.000000000 +0100 @@ -0,0 +1,3 @@ +package FalseModule; + +0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/lib/TrackLoad.pm new/Role-Tiny-1.003003/t/lib/TrackLoad.pm --- old/Role-Tiny-1.003002/t/lib/TrackLoad.pm 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/lib/TrackLoad.pm 2014-03-14 09:14:37.000000000 +0100 @@ -0,0 +1,4 @@ +package TrackLoad; +our $LOADED; +$LOADED++; +1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/load-module.t new/Role-Tiny-1.003003/t/load-module.t --- old/Role-Tiny-1.003002/t/load-module.t 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/load-module.t 2014-03-14 09:14:37.000000000 +0100 @@ -0,0 +1,32 @@ +use strict; +use warnings FATAL => 'all'; +use Test::More; +use Test::Fatal; + +use Role::Tiny (); + +use lib 't/lib'; + +{ + package TrackLoad; + our $LOADED = 0; +} + +Role::Tiny::_load_module('TrackLoad'); +is $TrackLoad::LOADED, 0, 'modules not loaded if symbol table entries exist'; + +eval { Role::Tiny::_load_module('BrokenModule') }; +like "$@", qr/Compilation failed/, + 'broken modules throw errors'; +eval { require BrokenModule }; +like "$@", qr/Compilation failed/, + ' ... and still fail if required again'; + +eval { Role::Tiny::_load_module('FalseModule') }; +like "$@", qr/did not return a true value/, + 'modules returning false throw errors'; +eval { require FalseModule }; +like "$@", qr/did not return a true value/, + ' ... and still fail if required again'; + +done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/modifiers.t new/Role-Tiny-1.003003/t/modifiers.t --- old/Role-Tiny-1.003002/t/modifiers.t 2013-02-08 00:53:06.000000000 +0100 +++ new/Role-Tiny-1.003003/t/modifiers.t 2014-03-14 09:14:37.000000000 +0100 @@ -45,6 +45,19 @@ around 'broken modifier' => sub { my $orig = shift; $orig->(@_) }; } +BEGIN { + package MyRole2; + use Role::Tiny; + with 'MyRole'; +} + +BEGIN { + package ExtraClass2; + use Role::Tiny::With; + with 'MyRole2'; + sub foo { 'class foo' } +} + sub try_apply_to { my $to = shift; exception { Role::Tiny->apply_role_to_package($to, 'MyRole') } @@ -54,6 +67,9 @@ is(MyClass->foo, 'role foo class foo', 'method modifier'); is(ExtraClass->foo, 'role foo class foo', 'method modifier with composition'); +is(ExtraClass2->foo, 'role foo class foo', + 'method modifier with role composed into role'); + ok(exception { my $new_class = Role::Tiny->create_class_with_roles('MyClass', 'BrokenRole'); }, 'exception caught creating class with broken modifier in a role'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/overload.t new/Role-Tiny-1.003003/t/overload.t --- old/Role-Tiny-1.003002/t/overload.t 1970-01-01 01:00:00.000000000 +0100 +++ new/Role-Tiny-1.003003/t/overload.t 2014-03-14 09:14:37.000000000 +0100 @@ -0,0 +1,73 @@ +use strict; +use warnings FATAL => 'all'; +use Test::More; + +BEGIN { + package MyRole; + use Role::Tiny; + + sub as_string { "welp" } + sub as_num { 219 } + use overload + '""' => \&as_string, + '0+' => 'as_num', + bool => sub(){0}, + fallback => 1; +} + +BEGIN { + package MyClass; + use Role::Tiny::With; + with 'MyRole'; + sub new { bless {}, shift } +} + +BEGIN { + package MyClass2; + use overload + fallback => 0, + '""' => 'class_string', + '0+' => sub { 42 }, + ; + use Role::Tiny::With; + with 'MyRole'; + sub new { bless {}, shift } + sub class_string { 'yarp' } +} + +BEGIN { + package MyClass3; + sub new { bless {}, shift } +} + +{ + my $o = MyClass->new; + is "$o", 'welp', 'subref overload'; + is sprintf('%d', $o), 219, 'method name overload'; + ok !$o, 'anon subref overload'; +} + +{ + my $o = MyClass2->new; + eval { my $f = 0+$o }; + like $@, qr/no method found/, 'fallback value not overwritten'; + is "$o", 'yarp', 'method name overload not overwritten'; + is sprintf('%d', $o), 42, 'subref overload not overwritten'; +} + +{ + my @o = (MyClass3->new) x 2; + my $copy = ''; + for my $o (@o) { + Role::Tiny->apply_roles_to_object($o, 'MyRole') + unless $copy; + local $TODO = 'magic not applied to all ref copies on perl < 5.8.9' + if $copy && $] < 5.008009; + is "$o", 'welp', 'subref overload applied to instance'.$copy; + is sprintf('%d', $o), 219, 'method name overload applied to instance'.$copy; + ok !$o, 'anon subref overload applied to instance'.$copy; + $copy ||= ' copy'; + } +} + +done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/role-basic-00-load.t new/Role-Tiny-1.003003/t/role-basic-00-load.t --- old/Role-Tiny-1.003002/t/role-basic-00-load.t 2013-01-19 02:20:25.000000000 +0100 +++ new/Role-Tiny-1.003003/t/role-basic-00-load.t 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -use Test::More tests => 1; - -BEGIN { - use_ok( 'Role::Tiny' ) || BAIL_OUT "Could not load Role::Tiny: $!"; -} - -diag( "Testing Role::Tiny $Role::Tiny::VERSION, Perl $], $^X" ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/role-basic-composition.t new/Role-Tiny-1.003003/t/role-basic-composition.t --- old/Role-Tiny-1.003002/t/role-basic-composition.t 2013-08-27 13:36:59.000000000 +0200 +++ new/Role-Tiny-1.003003/t/role-basic-composition.t 2014-01-13 19:23:45.000000000 +0100 @@ -201,4 +201,35 @@ is $success, 1, 'composed diamantly dependent roles successfully' or diag "Error: $@"; } +{ + { + package My::Does::Conflict; + use Role::Tiny; + + sub method { + return __PACKAGE__ . " method"; + } + } + { + package My::Class::Base; + + sub turbo_charger { + return __PACKAGE__ . " turbo charger"; + } + sub method { + return __PACKAGE__ . " method"; + } + } + my $success = eval q{ + package My::Class::Child; + use base 'My::Class::Base'; + use Role::Tiny::With; + with qw/My::Does::Basic1 My::Does::Conflict/; + 1; + }; + is $success, 1, 'role conflict resolved by superclass method' or diag "Error: $@"; + can_ok 'My::Class::Child', 'method'; + is My::Class::Child->method, 'My::Class::Base method', 'inherited method prevails'; +} + done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Role-Tiny-1.003002/t/role-long-package-name.t new/Role-Tiny-1.003003/t/role-long-package-name.t --- old/Role-Tiny-1.003002/t/role-long-package-name.t 2013-08-29 15:01:37.000000000 +0200 +++ new/Role-Tiny-1.003003/t/role-long-package-name.t 2014-02-24 01:10:08.000000000 +0100 @@ -35,8 +35,8 @@ } my $pkg = ref $foo; -note $pkg; eval "package $pkg;"; -ok(!$@) or diag $@; +is $@, '', 'package name usable by perl' + or diag "package: $pkg"; done_testing; -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
