use strict;
use warnings;
+use 5.008;
+
use MRO::Compat;
use Carp 'confess';
# this is either part of core or set up appropriately by MRO::Compat
*check_package_cache_flag = \&mro::get_pkg_gen;
+
+ eval {
+ require Devel::GlobalDestruction;
+ Devel::GlobalDestruction->import("in_global_destruction");
+ 1;
+ } or *in_global_destruction = sub () { !1 };
}
: sub () { 1 };
}
-our $VERSION = '0.65';
+our $VERSION = '0.64_03';
+$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
# after that everything is loaded, if we're allowed try to load faster XS
))
);
-# NOTE:
-# use the metaclass to construct the meta-package
-# which is a superclass of the metaclass itself :P
-Class::MOP::Package->meta->add_method('initialize' => sub {
- my $class = shift;
- my $package_name = shift;
- $class->meta->new_object('package' => $package_name, @_);
-});
-
## --------------------------------------------------------
## Class::MOP::Module
))
);
-# NOTE: (meta-circularity)
-# This should be one of the last things done
-# it will "tie the knot" with Class::MOP::Attribute
-# so that it uses the attributes meta-objects
-# to construct itself.
-Class::MOP::Attribute->meta->add_method('new' => sub {
- my ( $class, @args ) = @_;
-
- unshift @args, "name" if @args % 2 == 1;
- my %options = @args;
-
- my $name = $options{name};
-
- (defined $name && $name)
- || confess "You must provide a name for the attribute";
- $options{init_arg} = $name
- if not exists $options{init_arg};
-
- if(exists $options{builder}){
- confess("builder must be a defined scalar value which is a method name")
- if ref $options{builder} || !(defined $options{builder});
- confess("Setting both default and builder is not allowed.")
- if exists $options{default};
- } else {
- (Class::MOP::Attribute::is_default_a_coderef(\%options))
- || confess("References are not allowed as default values, you must ".
- "wrap the default of '$name' in a CODE reference (ex: sub { [] } and not [])")
- if exists $options{default} && ref $options{default};
- }
-
- # return the new object
- $class->meta->new_object(%options);
-});
-
Class::MOP::Attribute->meta->add_method('clone' => sub {
my $self = shift;
$self->meta->clone_object($self, @_);
))
);
-# FIMXE prime candidate for immutablization
-Class::MOP::Method->meta->add_method('wrap' => sub {
- my ( $class, @args ) = @_;
-
- unshift @args, 'body' if @args % 2 == 1;
-
- my %options = @args;
- my $code = $options{body};
-
- ('CODE' eq ref($code))
- || confess "You must supply a CODE reference to bless, not (" . ($code || 'undef') . ")";
-
- ($options{package_name} && $options{name})
- || confess "You must supply the package_name and name parameters";
-
- # return the new object
- $class->meta->new_object(%options);
-});
-
Class::MOP::Method->meta->add_method('clone' => sub {
my $self = shift;
$self->meta->clone_object($self, @_);
))
);
-Class::MOP::Method::Generated->meta->add_method('new' => sub {
- my ($class, %options) = @_;
- ($options{package_name} && $options{name})
- || confess "You must supply the package_name and name parameters";
- my $self = $class->meta->new_object(%options);
- $self->initialize_body;
- $self;
-});
-
## --------------------------------------------------------
## Class::MOP::Method::Accessor
))
);
-Class::MOP::Method::Accessor->meta->add_method('new' => sub {
- my $class = shift;
- my %options = @_;
-
- (exists $options{attribute})
- || confess "You must supply an attribute to construct with";
-
- (exists $options{accessor_type})
- || confess "You must supply an accessor_type to construct with";
-
- (Scalar::Util::blessed($options{attribute}) && $options{attribute}->isa('Class::MOP::Attribute'))
- || confess "You must supply an attribute which is a 'Class::MOP::Attribute' instance";
-
- ($options{package_name} && $options{name})
- || confess "You must supply the package_name and name parameters";
-
- # 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->{'attribute'});
-
- $self->initialize_body;
-
- $self;
-});
-
-
## --------------------------------------------------------
## Class::MOP::Method::Constructor
))
);
-Class::MOP::Method::Constructor->meta->add_method('new' => sub {
- my $class = shift;
- my %options = @_;
-
- (Scalar::Util::blessed $options{metaclass} && $options{metaclass}->isa('Class::MOP::Class'))
- || confess "You must pass a metaclass instance if you want to inline"
- if $options{is_inline};
-
- ($options{package_name} && $options{name})
- || confess "You must supply the package_name and name parameters";
-
- # 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
Class::MOP::Instance->meta->add_attribute(
Class::MOP::Attribute->new('attributes',
- reader => { attributes => \&Class::MOP::Instance::attributes },
+ reader => { attributes => \&Class::MOP::Instance::get_all_attributes },
),
);
# 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};
# no actual benefits.
$_->meta->make_immutable(
- inline_constructor => 0,
- inline_accessors => 0,
+ inline_constructor => 1,
+ replace_constructor => 1,
+ constructor_name => "_new",
+ inline_accessors => 0,
) for qw/
Class::MOP::Package
Class::MOP::Module
as C<Sub::Name::subname> does, otherwise it will just return the C<$code>
argument.
+=item B<in_global_destruction>
+
+If L<Devel::GlobalDestruction> is available, this returns true under global
+destruction.
+
+Otherwise it's a constant returning false.
+
=back
=head2 Metaclass cache functions