X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FRole.pm;h=87aaa8ea31e639badb9bf911944f4b3e96e16abf;hb=c6d8f5caf4ee3eccf6d417ddb19d51ebdc209112;hp=8b437ec7ec4ba1c1b4d3963e0df3a0f8fe5ea258;hpb=bc71de540020f1b2b75bafd69e2021c103e1c4e3;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Role.pm b/lib/Mouse/Meta/Role.pm index 8b437ec..87aaa8e 100644 --- a/lib/Mouse/Meta/Role.pm +++ b/lib/Mouse/Meta/Role.pm @@ -2,14 +2,24 @@ package Mouse::Meta::Role; use strict; use warnings; -use Mouse::Util qw(not_supported english_list); +use Mouse::Util qw(:meta not_supported english_list get_code_info); use Mouse::Meta::Module; - -use base qw(Mouse::Meta::Module); +our @ISA = qw(Mouse::Meta::Module); sub method_metaclass(){ 'Mouse::Meta::Role::Method' } # required for get_method() -sub _new { +# XXX: for backward compatibility +my %foreign = map{ $_ => undef } qw(Mouse::Role Carp Scalar::Util UNIVERSAL); +sub _code_is_mine{ + my($self, $code) = @_; + + my($package, $name) = get_code_info($code); + + return $package && !exists $foreign{$package}; +} + + +sub _construct_meta { my $class = shift; my %args = @_; @@ -22,7 +32,7 @@ sub _new { # return Mouse::Meta::Class->initialize($class)->new_object(%args) # if $class ne __PACKAGE__; - return bless \%args, $class; + return bless \%args, ref($class) || $class; } sub create_anon_role{ @@ -41,8 +51,7 @@ sub get_required_method_list{ } sub add_required_methods { - my $self = shift; - my @methods = @_; + my($self, @methods) = @_; push @{$self->{required_methods}}, @methods; } @@ -181,15 +190,7 @@ sub _apply_attributes{ my $spec = $role->get_attribute($attr_name); - my $attr_metaclass = 'Mouse::Meta::Attribute'; - if ( my $metaclass_name = $spec->{metaclass} ) { - $attr_metaclass = Mouse::Util::resolve_metaclass_alias( - 'Attribute', - $metaclass_name - ); - } - - $attr_metaclass->create($class, $attr_name => %$spec); + $class->add_attribute($attr_name => %{$spec}); } } elsif($args->{_to} eq 'role'){ @@ -425,3 +426,14 @@ sub does_role { 1; +__END__ + +=head1 NAME + +Mouse::Meta::Role - The Mouse Role metaclass + +=head1 SEE ALSO + +L + +=cut