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=7ba56929e1674836fa028b965502eaad7d804abf;hp=4761e5d86ebdcf6eb08370b9193d57e78eea1b6e;hb=88ed718958233d513d2a64db12c69ec2e2653e0c;hpb=ab1a1cce52104e19f86fec43e8ffa9f008041ee5 diff --git a/lib/Mouse/Meta/Class.pm b/lib/Mouse/Meta/Class.pm index 4761e5d..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; @@ -319,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" @@ -356,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}})