X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FMeta%2FClass.pm;h=7ba56929e1674836fa028b965502eaad7d804abf;hb=88ed718958233d513d2a64db12c69ec2e2653e0c;hp=9e55fa47ce2d4e1bda466a308bcf8a5c3b1d4fb1;hpb=518e303aafaeb9885807830ebdc1a55010107a5a;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 9e55fa4..7ba5692 100644 --- a/lib/Mouse/Meta/Class.pm +++ b/lib/Mouse/Meta/Class.pm @@ -20,12 +20,13 @@ do { } sub initialize { - my $class = blessed($_[0]) || $_[0]; - my $name = $_[1]; + my($class, $package_name, @args) = @_; - $METACLASS_CACHE{$name} = $class->new(name => $name) - if !exists($METACLASS_CACHE{$name}); - return $METACLASS_CACHE{$name}; + ($package_name && !ref($package_name)) + || confess("You must pass a package name and it cannot be blessed"); + + return $METACLASS_CACHE{$package_name} + ||= $class->_construct_class_instance(package => $package_name, @args); } # Means of accessing all the metaclasses that have @@ -40,21 +41,20 @@ do { sub remove_metaclass_by_name { $METACLASS_CACHE{$_[0]} = undef } }; -sub new { - my $class = shift; - my %args = @_; +sub _construct_class_instance { + my($class, %args) = @_; - $args{attributes} = {}; + $args{attributes} = {}; $args{superclasses} = do { no strict 'refs'; - \@{ $args{name} . '::ISA' }; + \@{ $args{package} . '::ISA' }; }; $args{roles} ||= []; bless \%args, $class; } -sub name { $_[0]->{name} } +sub name { $_[0]->{package} } sub superclasses { my $self = shift; @@ -209,6 +209,7 @@ sub make_immutable { my $self = shift; my %args = ( inline_constructor => 1, + inline_destructor => 1, @_, ); @@ -309,7 +310,7 @@ sub does_role { for my $class ($self->linearized_isa) { next unless $class->can('meta') and $class->meta->can('roles'); - for my $role (@{ $self->roles }) { + for my $role (@{ $class->meta->roles }) { return 1 if $role->name eq $role_name; } } @@ -318,7 +319,7 @@ sub does_role { } sub create { - my ($self, $package_name, %options) = @_; + my ($class, $package_name, %options) = @_; (ref $options{superclasses} eq 'ARRAY') || confess "You must pass an ARRAY ref of superclasses" @@ -355,11 +356,11 @@ sub create { version authority )}; - my $meta = $self->initialize( $package_name => %initialize_options ); + my $meta = $class->initialize( $package_name => %initialize_options ); # FIXME totally lame $meta->add_method('meta' => sub { - $self->initialize(ref($_[0]) || $_[0]); + Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]); }); $meta->superclasses(@{$options{superclasses}})