X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FRole.pm;h=062de31a85369837d4ecbbb3cc045bbe19efbc3d;hb=88f2397731d9dc7da456b70b1c1c452bc4b396e2;hp=0aeb2f445a8eb9538fb4aa733f64e02827943184;hpb=778db3ac5dc266115efefdeb6dcbcf9b2444d9c9;p=gitmo%2FMoose.git diff --git a/lib/Moose/Role.pm b/lib/Moose/Role.pm index 0aeb2f4..062de31 100644 --- a/lib/Moose/Role.pm +++ b/lib/Moose/Role.pm @@ -8,12 +8,14 @@ use Scalar::Util 'blessed'; use Carp 'confess'; use Sub::Name 'subname'; +use Data::OptList; use Sub::Exporter; -our $VERSION = '0.07'; +our $VERSION = '0.08'; our $AUTHORITY = 'cpan:STEVAN'; -use Moose (); +use Moose (); +use Moose::Util (); use Moose::Meta::Role; use Moose::Util::TypeConstraints; @@ -27,11 +29,7 @@ use Moose::Util::TypeConstraints; return $METAS{$role} if exists $METAS{$role}; # make a subtype for each Moose class - subtype $role - => as 'Role' - => where { $_->does($role) } - => optimize_as { blessed($_[0]) && $_[0]->can('does') && $_[0]->does($role) } - unless find_type_constraint($role); + role_type $role unless find_type_constraint($role); my $meta; if ($role->can('meta')) { @@ -58,20 +56,7 @@ use Moose::Util::TypeConstraints; with => sub { my $meta = _find_meta(); return subname 'Moose::Role::with' => sub (@) { - my (@roles) = @_; - confess "Must specify at least one role" unless @roles; - Class::MOP::load_class($_) for @roles; - ($_->can('meta') && $_->meta->isa('Moose::Meta::Role')) - || confess "You can only consume roles, $_ is not a Moose role" - foreach @roles; - if (scalar @roles == 1) { - $roles[0]->meta->apply($meta); - } - else { - Moose::Meta::Role->combine( - map { $_->meta } @roles - )->apply($meta); - } + Moose::Util::apply_all_roles($meta, @_) }; }, requires => sub { @@ -116,14 +101,13 @@ use Moose::Util::TypeConstraints; $meta->add_around_method_modifier($_, $code) for @_; }; }, + # see Moose.pm for discussion super => sub { - { - no strict 'refs'; - $Moose::SUPER_SLOT{$CALLER} = \*{"${CALLER}::super"}; - } - my $meta = _find_meta(); - return subname 'Moose::Role::super' => sub {}; + return subname 'Moose::Role::super' => sub { return unless $Moose::SUPER_BODY; $Moose::SUPER_BODY->(@Moose::SUPER_ARGS) } }, + #next => sub { + # return subname 'Moose::Role::next' => sub { @_ = @Moose::SUPER_ARGS; goto \&next::method }; + #}, override => sub { my $meta = _find_meta(); return subname 'Moose::Role::override' => sub ($&) { @@ -165,6 +149,10 @@ use Moose::Util::TypeConstraints; && defined $_[1]->{into_level} ? caller( $_[1]->{into_level} ) : caller(); + # this works because both pragmas set $^H (see perldoc perlvar) + # which affects the current compilation - i.e. the file who use'd + # us - which is why we don't need to do anything special to make + # it affect that file rather than this one (which is already compiled) strict->import; warnings->import;