Moos
view release on metacpan or search on metacpan
lib/Moos.pm view on Meta::CPAN
# The entire implementation of Moos (and all its related classes) are defined
# inside this one file.
use strict; use warnings;
my $VALID_NAME = qr{ ^ [^\W0-9] \w* $ }ix;
package Moos;
our $VERSION = '0.30';
use Scalar::Util;
use Carp qw(confess);
if ($] >= 5.010) {
require mro;
}
else {
require MRO::Compat;
}
our $CAN_HAZ_XS =
!$ENV{PERL_MOOS_XS_DISABLE} &&
eval{ require Class::XSAccessor; Class::XSAccessor->VERSION("1.07"); 1 };
use constant default_metaclass => 'Moos::Meta::Class';
use constant default_metarole => 'Moos::Meta::Role';
use constant default_base_class => 'Moos::Object';
sub import {
# Turn on strict/warnings for caller
strict->import;
warnings->import;
($_[1]||'') eq -Role and goto \&role_import;
my ($class, %args) = @_;
my $package = caller;
# Create/register a metaclass object for the package
my $metaclass =
delete $args{metaclass}
|| $class->default_metaclass;
my $meta = $metaclass->initialize($package, %args);
# Make calling class inherit from Moos::Object by default
my $baseclass = exists $args{base_class}
? delete $args{base_class}
: $class->default_base_class;
extends($meta, $baseclass) if defined $baseclass;
# Export the 'has', 'extends', and 'with' helper functions
_export($package, has => \&has, $meta);
_export($package, extends => \&extends, $meta);
_export($package, with => \&with, $meta);
# Export the 'blessed' and 'confess' functions
_export($package, blessed => \&Scalar::Util::blessed);
_export($package, confess => \&Carp::confess);
# Possibly export some handy debugging stuff
_export_xxx($package) if $ENV{PERL_MOOS_XXX};
}
sub role_import {
my ($class, undef, %args) = @_;
my $package = caller;
# Create/register a metaclass object for the package
my $metarole =
delete $args{metarole}
|| $class->default_metarole;
my $meta = $metarole->initialize($package, %args);
# Using 'eval' rather that exporting ensures that this method
# will not be cleaned up by namespace::autoclean-type things.
eval q{
package }.$package.q{;
sub meta {
Moos::Meta::Role->initialize(
Scalar::Util::blessed($_[0]) || $_[0]
);
}
};
# Export the 'has' helper function
_export($package, has => \&has, $meta);
# Export the 'blessed' and 'confess' functions
_export($package, blessed => \&Scalar::Util::blessed);
_export($package, confess => \&Carp::confess);
( run in 1.270 second using v1.01-cache-2.11-cpan-39bf76dae61 )