X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FClass.pm;h=3f9c54c28abf1ff074573c1d596783705c11c62e;hb=45f2e6a79a018ba03e0103272ab2830ee2efa783;hp=73264d12ca511c847411e677d5d851119f69ee6b;hpb=8fcbe7fb24ac710b860595ae1ecea066c3add1f5;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 73264d1..3f9c54c 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -3,11 +3,11 @@ package Mouse::Meta::Class; use strict; use warnings; +use Mouse::Meta::Method::Constructor; +use Mouse::Meta::Method::Destructor; use Mouse::Util qw/get_linear_isa blessed/; use Carp 'confess'; -use Class::Method::Modifiers (); - do { my %METACLASS_CACHE; @@ -37,6 +37,7 @@ sub new { no strict 'refs'; \@{ $args{name} . '::ISA' }; }; + $args{roles} ||= []; bless \%args, $class; } @@ -65,6 +66,20 @@ sub add_method { *{ $pkg . '::' . $name } = $code; } +# copied from Class::Inspector +sub get_method_list { + my $self = shift; + my $name = $self->name; + + no strict 'refs'; + # Get all the CODE symbol table entries + my @functions = grep !/^meta$/, + grep { /\A[^\W\d]\w*\z/o } + grep { defined &{"${name}::$_"} } + keys %{"${name}::"}; + wantarray ? @functions : \@functions; +} + sub add_attribute { my $self = shift; my $attr = shift; @@ -125,13 +140,24 @@ sub clone_instance { } -sub make_immutable {} -sub is_immutable { 0 } +sub make_immutable { + my $self = shift; + my $name = $self->name; + $self->{is_immutable}++; + no strict 'refs'; + *{"$name\::new"} = Mouse::Meta::Method::Constructor->generate_constructor_method_inline( $self ); + *{"$name\::DESTROY"} = Mouse::Meta::Method::Destructor->generate_destructor_method_inline( $self ); +} +sub make_mutable { + Carp::croak "Mouse::Meta::Class->make_mutable does not supported by Mouse"; +} +sub is_immutable { $_[0]->{is_immutable} } sub attribute_metaclass { "Mouse::Meta::Class" } sub add_before_method_modifier { my ($self, $name, $code) = @_; + require Class::Method::Modifiers; Class::Method::Modifiers::_install_modifier( $self->name, 'before', @@ -142,6 +168,7 @@ sub add_before_method_modifier { sub add_around_method_modifier { my ($self, $name, $code) = @_; + require Class::Method::Modifiers; Class::Method::Modifiers::_install_modifier( $self->name, 'around', @@ -152,6 +179,7 @@ sub add_around_method_modifier { sub add_after_method_modifier { my ($self, $name, $code) = @_; + require Class::Method::Modifiers; Class::Method::Modifiers::_install_modifier( $self->name, 'after', @@ -160,6 +188,18 @@ sub add_after_method_modifier { ); } +sub roles { $_[0]->{roles} } + +sub does_role { + my ($self, $role_name) = @_; + (defined $role_name) + || confess "You must supply a role name to look for"; + for my $role (@{ $self->{roles} }) { + return 1 if $role->name eq $role_name; + } + return 0; +} + 1; __END__