NAME
MooseX::Extended::Manual::Construction - Objected construction for MooseX::Extended
VERSION
version 0.34
OBJECT CONSTRUCTION
The normal new
, BUILD
, and BUILDARGS
functions work as expected. However, we apply MooseX::StrictConstructor to avoid this problem:
my $soldier = Soldier->new(
name => $name,
rank => $rank,
seriel => $serial, # should be serial
);
By default, misspelled arguments to the Moose constructor are silently discarded, leading to hard-to-diagnose bugs. With MooseX::Extended, they're a fatal error.
If you need to pass arbitrary "sideband" data, explicitly declare it as such:
param sideband => ( isa => HashRef, default => sub { {} } );
Naturally, because we bundle MooseX::Extended::Types, you can do much finer-grained data validation on that, if needed.
FUNCTIONS
The following two functions are exported into your namespace.
param
param name => ( isa => NonEmptyStr );
A similar function to Moose's has
. A param
is required. You may pass it to the constructor, or use a default
or builder
to supply this value.
The above param
definition is equivalent to:
has name => (
is => 'ro',
isa => NonEmptyStr,
required => 1,
);
If you want a parameter that has no default
or builder
and can optionally be passed to the constructor, just use required => 0
.
param title => ( isa => Str, required => 0 );
Note that param
, like field
, defaults to read-only, is => 'ro'
. You can override this:
param name => ( is => 'rw', isa => NonEmptyStr );
Otherwise, it behaves like has
. You can pass in any arguments that has
accepts.
# we'll make it private, but allow it to be passed to the constructor
# as `name`
param _name => ( isa => NonEmptyStr, init_arg => 'name' );
field
field created => ( isa => PositiveInt, default => sub { time } );
A similar function to Moose's has
. A field
is almost never allowed to be passed to the constructor, but you can still use default
or builder
, as normal.
The above field
definition is equivalent to:
has created => (
is => 'ro',
isa => PositiveInt,
init_arg => undef, # not allowed in the constructor
default => sub { time },
lazy => 1,
);
Note that field
, like param
, defaults to read-only, is => 'ro'
. You can override this:
field some_data => ( is => 'rw', isa => NonEmptyStr );
Otherwise, it behaves like has
. You can pass in any arguments that has
accepts.
WARNING: if you pass field
an init_arg
with a defined value, The code will croak
unless that value begins with an underscore:
field created => (
isa => PositiveInt,
default => sub {time},
lazy => 0, # because it must fire at object creation
init_arg => '_created', # but let them override this in tests
);
The above allows you to pass _created => 42
in the constructor. This is useful when you wish to easily control this value for tests.
Otherwise, a field
is just for internal instance data the class uses. It's not to be passed to the constructor. If you want that, just use param
.
Lazy Fields
A field
is automatically lazy if it has a builder
or default
. This is because there's no guarantee the code will call them, but this makes it very easy for a field
to rely on a param
value being present. Note that is does mean if you need a field
to be initialized at construction time, you have to take care:
has created => ( isa => PositiveInt, lazy => 0, default => sub {time} );
No param
is lazy by default, but you can add lazy => 1
if you need to.
AUTHOR
Curtis "Ovid" Poe <curtis.poe@gmail.com>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2022 by Curtis "Ovid" Poe.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)