X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP.pm;h=8f2f6ac4fd99f629702d2fb04f83577e3e0e8a0c;hb=19042e4de51060275cd940cf997a6791afb0dfec;hp=e9f94f2faae6afbaa2e0b3fcd8c12d7c1e96b4a2;hpb=943cbe2dc6895a397ba6cc20469eb26e04933472;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index e9f94f2..8f2f6ac 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -29,7 +29,7 @@ BEGIN { *check_package_cache_flag = \&mro::get_pkg_gen; } -our $VERSION = '0.83'; +our $VERSION = '0.92'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; @@ -43,10 +43,9 @@ XSLoader::load( __PACKAGE__, $XS_VERSION ); # there is no need to worry about destruction though # because they should die only when the program dies. # After all, do package definitions even get reaped? + # Anonymous classes manage their own destruction. my %METAS; - # means of accessing all the metaclasses that have - # been initialized thus far (for mugwumps obj browser) sub get_all_metaclasses { %METAS } sub get_all_metaclass_instances { values %METAS } sub get_all_metaclass_names { keys %METAS } @@ -54,7 +53,7 @@ XSLoader::load( __PACKAGE__, $XS_VERSION ); sub store_metaclass_by_name { $METAS{$_[0]} = $_[1] } sub weaken_metaclass { weaken($METAS{$_[0]}) } sub does_metaclass_exist { exists $METAS{$_[0]} && defined $METAS{$_[0]} } - sub remove_metaclass_by_name { $METAS{$_[0]} = undef } + sub remove_metaclass_by_name { delete $METAS{$_[0]}; return } # This handles instances as well as class names sub class_of { @@ -93,10 +92,10 @@ sub load_first_existing_class { my $found; my %exceptions; for my $class (@classes) { - my $pmfile = _class_to_pmfile($class); my $e = _try_load_one_class($class); if ($e) { + my $pmfile = _class_to_pmfile($class); $exceptions{$class} = $e; last if $e !~ /^Can't locate \Q$pmfile\E in \@INC/; } @@ -131,6 +130,7 @@ sub _try_load_one_class { return do { local $@; + local $SIG{__DIE__}; eval { require($file) }; $@; }; @@ -219,6 +219,42 @@ Class::MOP::Package->meta->add_attribute( )) ); +Class::MOP::Package->meta->add_attribute( + Class::MOP::Attribute->new('methods' => ( + reader => { + # NOTE: + # we just alias the original method + # rather than re-produce it here + 'get_method_map' => \&Class::MOP::Package::get_method_map + }, + default => sub { {} } + )) +); + +Class::MOP::Package->meta->add_attribute( + Class::MOP::Attribute->new('method_metaclass' => ( + reader => { + # NOTE: + # we just alias the original method + # rather than re-produce it here + 'method_metaclass' => \&Class::MOP::Package::method_metaclass + }, + default => 'Class::MOP::Method', + )) +); + +Class::MOP::Package->meta->add_attribute( + Class::MOP::Attribute->new('wrapped_method_metaclass' => ( + reader => { + # NOTE: + # we just alias the original method + # rather than re-produce it here + 'wrapped_method_metaclass' => \&Class::MOP::Package::wrapped_method_metaclass + }, + default => 'Class::MOP::Method::Wrapped', + )) +); + ## -------------------------------------------------------- ## Class::MOP::Module @@ -283,18 +319,6 @@ Class::MOP::Class->meta->add_attribute( ); Class::MOP::Class->meta->add_attribute( - Class::MOP::Attribute->new('methods' => ( - reader => { - # NOTE: - # we just alias the original method - # rather than re-produce it here - 'get_method_map' => \&Class::MOP::Class::get_method_map - }, - default => sub { {} } - )) -); - -Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('superclasses' => ( accessor => { # NOTE: @@ -320,30 +344,6 @@ Class::MOP::Class->meta->add_attribute( ); Class::MOP::Class->meta->add_attribute( - Class::MOP::Attribute->new('method_metaclass' => ( - reader => { - # NOTE: - # we just alias the original method - # rather than re-produce it here - 'method_metaclass' => \&Class::MOP::Class::method_metaclass - }, - default => 'Class::MOP::Method', - )) -); - -Class::MOP::Class->meta->add_attribute( - Class::MOP::Attribute->new('wrapped_method_metaclass' => ( - reader => { - # NOTE: - # we just alias the original method - # rather than re-produce it here - 'wrapped_method_metaclass' => \&Class::MOP::Class::wrapped_method_metaclass - }, - default => 'Class::MOP::Method::Wrapped', - )) -); - -Class::MOP::Class->meta->add_attribute( Class::MOP::Attribute->new('instance_metaclass' => ( reader => { # NOTE: we need to do this in order @@ -690,21 +690,14 @@ undef Class::MOP::Instance->meta->{_package_cache_flag}; # NOTE: we don't need to inline the the accessors this only lengthens # the compile time of the MOP, and gives us no actual benefits. -# this is just nitpicking to ensure Class::MOP::Class->meta == ->meta->meta -Class::MOP::Class->meta->_immutable_metaclass; -$Class::MOP::Class::immutable_metaclass_cache{"Class::MOP::Class"}{"Class::MOP::Class::Immutable::Trait"} = Class::MOP::Class::Immutable::Class::MOP::Class->meta; - $_->meta->make_immutable( - inline_constructor => 1, - replace_constructor => 1, + inline_constructor => 0, constructor_name => "_new", inline_accessors => 0, ) for qw/ Class::MOP::Package Class::MOP::Module Class::MOP::Class - Class::MOP::Class::Immutable::Trait - Class::MOP::Class::Immutable::Class::MOP::Class Class::MOP::Attribute Class::MOP::Method @@ -1159,6 +1152,8 @@ Yuval (nothingmuch) Kogman Scott (konobi) McWhirter +Dylan Hardison + =head1 COPYRIGHT AND LICENSE Copyright 2006-2009 by Infinity Interactive, Inc.