X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FClass.pm;h=38082915d9d912ba4faa365768972dbbb950a3fb;hp=73264d12ca511c847411e677d5d851119f69ee6b;hb=b6ffa107ada7a537575481d277818e207ed219fb;hpb=8fcbe7fb24ac710b860595ae1ecea066c3add1f5 diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 73264d1..3808291 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; @@ -65,6 +65,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 +139,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 +167,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 +178,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',