.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.48) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "MooseX::NonMoose 3" .TH MooseX::NonMoose 3 2026-08-20 "perl v5.44.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH SYNOPSIS .IX Header "SYNOPSIS" .Vb 4 \& package Term::VT102::NBased; \& use Moose; \& use MooseX::NonMoose; \& extends \*(AqTerm::VT102\*(Aq; \& \& has [qw/x_base y_base/] => ( \& is => \*(Aqro\*(Aq, \& isa => \*(AqInt\*(Aq, \& 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); .Ve .SH DESCRIPTION .IX Header "DESCRIPTION" \&\f(CW\*(C`MooseX::NonMoose\*(C'\fR 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 \&\f(CW\*(C`make_immutable\*(C'\fR time) a constructor that makes sure things like \f(CW\*(C`BUILD\*(C'\fR 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\*(Aqt inherit from anything at all. .PP There are several ways to use this module. The most straightforward is to just \&\f(CW\*(C`use MooseX::NonMoose;\*(C'\fR 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 \f(CW\*(C`\-traits\*(C'\fR option to your \f(CW\*(C`use Moose;\*(C'\fR 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\*(Aqt 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. .PP \&\f(CW\*(C`MooseX::NonMoose\*(C'\fR allows you to manipulate the argument list that gets passed to the superclass constructor by defining a \f(CW\*(C`FOREIGNBUILDARGS\*(C'\fR method. This is called with the same argument list as the \f(CW\*(C`BUILDARGS\*(C'\fR method, but should return a list of arguments to pass to the superclass constructor. This allows \&\f(CW\*(C`MooseX::NonMoose\*(C'\fR to support superclasses whose constructors would get confused by the extra arguments that Moose requires (for attributes, etc.) .PP Not all non\-Moose classes use \f(CW\*(C`new\*(C'\fR 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 \f(CW\*(C`extends\*(C'\fR. The syntax looks like this: .PP .Vb 1 \& extends \*(AqFoo\*(Aq => { \-constructor_name => \*(Aqcreate\*(Aq }; .Ve .PP similar to how you can already pass \f(CW\*(C`\-version\*(C'\fR in the \f(CW\*(C`extends\*(C'\fR call in a similar way. .SH BUGS/CAVEATS .IX Header "BUGS/CAVEATS" .IP \(bu 4 The reference that the non\-Moose class uses as its instance type \&\fBmust\fR match the instance type that Moose is using. Moose\*(Aqs default instance type is a hashref, but other modules exist to make Moose use other instance types. MooseX::InsideOut is the most general solution \- it should work with any class. For globref\-based classes in particular, MooseX::GlobRef will also allow Moose to work. For more information, see the \f(CW\*(C`032\-moosex\-insideout\*(C'\fR and \f(CW\*(C`033\-moosex\-globref\*(C'\fR tests bundled with this dist. .IP \(bu 4 Modifying your class\*(Aq \f(CW@ISA\fR after an initial \f(CW\*(C`extends\*(C'\fR call will potentially cause problems if any of those new entries in the \f(CW@ISA\fR override the constructor. \&\f(CW\*(C`MooseX::NonMoose\*(C'\fR wraps the nearest \f(CWnew()\fR method at the time \f(CW\*(C`extends\*(C'\fR is called and will not see any other \f(CWnew()\fR methods in the \f(CW@ISA\fR hierarchy. .IP \(bu 4 Completely overriding the constructor in a class using \&\f(CW\*(C`MooseX::NonMoose\*(C'\fR (i.e. using \f(CW\*(C`sub new { ... }\*(C'\fR) currently doesn\*(Aqt work, although using method modifiers on the constructor should work identically to normal Moose classes. .PP Please report any bugs to GitHub Issues at . .SH "SEE ALSO" .IX Header "SEE ALSO" .IP \(bu 4 "How do I make non\-Moose constructors work with Moose?" in Moose::Manual::FAQ .IP \(bu 4 MooseX::Alien .Sp serves the same purpose, but with a radically different (and far more hackish) implementation. .SH SUPPORT .IX Header "SUPPORT" You can find this documentation for this module with the perldoc command. .PP .Vb 1 \& perldoc MooseX::NonMoose .Ve .PP You can also look for information at: .IP \(bu 4 MetaCPAN .Sp .IP \(bu 4 Github .Sp .IP \(bu 4 RT: CPAN\*(Aqs request tracker .Sp