X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP.pm;h=4af79009dab71cc0dbc8c1decd6df50c8228d86b;hb=87715d2e8c8d3998753e6e792ea32be41dd2fafa;hp=ed5195f565696db21154eaabe6aee97fa935a044;hpb=63d08a9ec7cf3a1e74e999aabd54344a518a109d;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index ed5195f..4af7900 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -24,6 +24,10 @@ BEGIN { ? sub () { 0 } : sub () { 1 }; + *HAVE_ISAREV = defined(&mro::get_isarev) + ? sub () { 1 } + : sub () { 1 }; + # NOTE: # we may not use this yet, but once # the get_code_info XS gets merged @@ -47,20 +51,9 @@ BEGIN { # - SL no warnings 'prototype', 'redefine'; - unless (IS_RUNNING_ON_5_10()) { - # get this from MRO::Compat ... - *check_package_cache_flag = \&MRO::Compat::__get_pkg_gen_pp; - } - else { - # NOTE: - # but if we are running 5.10 - # there is no need to use the - # Pure Perl version since we - # can use the built in mro - # version instead. - # - SL - *check_package_cache_flag = \&mro::get_pkg_gen; - } + # this is either part of core or set up appropriately by MRO::Compat + *check_package_cache_flag = \&mro::get_pkg_gen; + # our own version of Sub::Name *subname = $_PP_subname; # and the Sub::Identify version of the get_code_info @@ -722,28 +715,15 @@ Class::MOP::Method::Constructor->meta->add_method('new' => sub { # these don't yet do much of anything, but are just # included for completeness -#Class::MOP::Instance->meta->add_method('new' => sub { -# my $class = shift; -# my $options = $class->BUILDARGS($class); -# -# # return the new object -# my $self = $class->meta->new_object(%$options); -# -# # we don't want this creating -# # a cycle in the code, if not -# # needed -# Scalar::Util::weaken($self->{'associated_metaclass'}); -# -# $self->initialize_body; -# -# $self; -#}); - Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('associated_metaclass') ); Class::MOP::Instance->meta->add_attribute( + Class::MOP::Attribute->new('attributes') +); + +Class::MOP::Instance->meta->add_attribute( Class::MOP::Attribute->new('slots') ); @@ -752,6 +732,24 @@ Class::MOP::Instance->meta->add_attribute( ); +# we need the meta instance of the meta instance to be created now, in order +# for the constructor to be able to use it +Class::MOP::Instance->meta->get_meta_instance; + +Class::MOP::Instance->meta->add_method('new' => sub { + my $class = shift; + my $options = $class->BUILDARGS(@_); + + my $self = $class->meta->new_object(%$options); + + Scalar::Util::weaken($self->{'associated_metaclass'}); + + $self; +}); + +# pretend the add_method never happenned. it hasn't yet affected anything +undef Class::MOP::Instance->meta->{_package_cache_flag}; + ## -------------------------------------------------------- ## Now close all the Class::MOP::* classes @@ -978,6 +976,11 @@ We set this constant depending on what version perl we are on, this allows us to take advantage of new 5.10 features and stay backwards compat. +=item I + +Whether or not C provides C, a much faster way to get all the +subclasses of a certain class. + =back =head2 Utility functions