| MooseX-NonMoose documentation | Contained in the MooseX-NonMoose distribution. |
032-moosex-insideout
and 033-moosex-globref tests bundled with this dist.MooseX::NonMoose (i.e. using sub new { ... }) currently doesn't work,
although using method modifiers on the constructor should work identically to
normal Moose classes.
MooseX::NonMoose - easy subclassing of non-Moose classes
version 0.22
package Term::VT102::NBased;
use Moose;
use MooseX::NonMoose;
extends 'Term::VT102';
has [qw/x_base y_base/] => (
is => 'ro',
isa => 'Int',
default => 1,
);
around x => sub {
my $orig = shift;
my $self = shift;
$self->$orig(@_) + $self->x_base - 1;
};
# ... (wrap other methods)
no Moose;
# no need to fiddle with inline_constructor here
__PACKAGE__->meta->make_immutable;
my $vt = Term::VT102::NBased->new(x_base => 0, y_base => 0);
MooseX::NonMoose allows for easily subclassing non-Moose classes with Moose,
taking care of the annoying details connected with doing this, such as setting
up proper inheritance from Moose::Object and installing (and inlining, at
make_immutable time) a constructor that makes sure things like BUILD
methods are called. It tries to be as non-intrusive as possible - when this
module is used, inheriting from non-Moose classes and inheriting from Moose
classes should work identically, aside from the few caveats mentioned below.
One of the goals of this module is that including it in a
Moose::Exporter-based package used across an entire application should be
possible, without interfering with classes that only inherit from Moose
modules, or even classes that don't inherit from anything at all.
There are several ways to use this module. The most straightforward is to just
use MooseX::NonMoose; in your class; this should set up everything necessary
for extending non-Moose modules. MooseX::NonMoose::Meta::Role::Class and
MooseX::NonMoose::Meta::Role::Constructor can also be applied to your
metaclasses manually, either by passing a -traits option to your use
Moose; line, or by applying them using Moose::Util::MetaRole in a
Moose::Exporter-based package. MooseX::NonMoose::Meta::Role::Class is the
part that provides the main functionality of this module; if you don't care
about inlining, this is all you need to worry about. Applying
MooseX::NonMoose::Meta::Role::Constructor as well will provide an inlined
constructor when you immutabilize your class.
MooseX::NonMoose allows you to manipulate the argument list that gets passed
to the superclass constructor by defining a FOREIGNBUILDARGS method. This is
called with the same argument list as the BUILDARGS method, but should
return a list of arguments to pass to the superclass constructor. This allows
MooseX::NonMoose to support superclasses whose constructors would get
confused by the extra arguments that Moose requires (for attributes, etc.)
Not all non-Moose classes use new as the name of their constructor. This
module allows you to extend these classes by explicitly stating which method is
the constructor, during the call to extends. The syntax looks like this:
extends 'Foo' => { -constructor_name => 'create' };
similar to how you can already pass -version in the extends call in a
similar way.
032-moosex-insideout
and 033-moosex-globref tests bundled with this dist.MooseX::NonMoose (i.e. using sub new { ... }) currently doesn't work,
although using method modifiers on the constructor should work identically to
normal Moose classes.Please report any bugs through RT: email
bug-moosex-nonmoose at rt.cpan.org, or browse to
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MooseX-NonMoose.
serves the same purpose, but with a radically different (and far more hackish) implementation.
You can find this documentation for this module with the perldoc command.
perldoc MooseX::NonMoose
You can also look for information at:
Jesse Luehrs <doy at tozt dot net>
This software is copyright (c) 2011 by Jesse Luehrs.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
| MooseX-NonMoose documentation | Contained in the MooseX-NonMoose distribution. |
package MooseX::NonMoose; BEGIN { $MooseX::NonMoose::VERSION = '0.22'; } use Moose::Exporter; # ABSTRACT: easy subclassing of non-Moose classes my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods( class_metaroles => { class => ['MooseX::NonMoose::Meta::Role::Class'], constructor => ['MooseX::NonMoose::Meta::Role::Constructor'], }, install => [qw(import unimport)], ); sub init_meta { my $package = shift; my %options = @_; my $meta = Class::MOP::class_of($options{for_class}); Carp::cluck('Roles have no use for MooseX::NonMoose') if $meta && $meta->isa('Moose::Meta::Role'); $package->$init_meta(@_); } 1; __END__