Finance-FITF
view release on metacpan or search on metacpan
inc/Class/MOP.pm view on Meta::CPAN
#line 1
package Class::MOP;
BEGIN {
$Class::MOP::AUTHORITY = 'cpan:STEVAN';
}
BEGIN {
$Class::MOP::VERSION = '2.0009';
}
use strict;
use warnings;
use 5.008;
use MRO::Compat;
use Carp 'confess';
use Scalar::Util 'weaken', 'isweak', 'reftype', 'blessed';
use Data::OptList;
use Try::Tiny;
use Class::MOP::Mixin::AttributeCore;
use Class::MOP::Mixin::HasAttributes;
use Class::MOP::Mixin::HasMethods;
use Class::MOP::Class;
use Class::MOP::Attribute;
use Class::MOP::Method;
BEGIN {
*IS_RUNNING_ON_5_10 = ($] < 5.009_005)
? sub () { 0 }
: sub () { 1 };
# this is either part of core or set up appropriately by MRO::Compat
*check_package_cache_flag = \&mro::get_pkg_gen;
}
XSLoader::load(
'Moose',
$Class::MOP::{VERSION} ? ${ $Class::MOP::{VERSION} } : ()
);
{
# Metaclasses are singletons, so we cache them here.
# 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;
sub get_all_metaclasses { %METAS }
sub get_all_metaclass_instances { values %METAS }
sub get_all_metaclass_names { keys %METAS }
sub get_metaclass_by_name { $METAS{$_[0]} }
sub store_metaclass_by_name { $METAS{$_[0]} = $_[1] }
sub weaken_metaclass { weaken($METAS{$_[0]}) }
sub metaclass_is_weak { isweak($METAS{$_[0]}) }
sub does_metaclass_exist { exists $METAS{$_[0]} && defined $METAS{$_[0]} }
sub remove_metaclass_by_name { delete $METAS{$_[0]}; return }
# This handles instances as well as class names
sub class_of {
return unless defined $_[0];
my $class = blessed($_[0]) || $_[0];
return $METAS{$class};
}
# NOTE:
# We only cache metaclasses, meaning instances of
# Class::MOP::Class. We do not cache instance of
# Class::MOP::Package or Class::MOP::Module. Mostly
# because I don't yet see a good reason to do so.
}
sub _class_to_pmfile {
my $class = shift;
my $file = $class . '.pm';
$file =~ s{::}{/}g;
return $file;
}
sub load_first_existing_class {
my $classes = Data::OptList::mkopt(\@_)
or return;
foreach my $class (@{ $classes }) {
my $name = $class->[0];
unless ( _is_valid_class_name($name) ) {
my $display = defined($name) ? $name : 'undef';
confess "Invalid class name ($display)";
}
}
my $found;
my %exceptions;
for my $class (@{ $classes }) {
my ($name, $options) = @{ $class };
if ($options) {
return $name if is_class_loaded($name, $options);
if (is_class_loaded($name)) {
# we already know it's loaded and too old, but we call
# ->VERSION anyway to generate the exception for us
$name->VERSION($options->{-version});
}
}
else {
return $name if is_class_loaded($name);
}
my $file = _class_to_pmfile($name);
return $name if try {
local $SIG{__DIE__};
( run in 2.023 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )