NAME

Marlin::X::UndefTolerant - Marlin extension to make your constructor forgive undefs.

SYNOPSIS

package Local::Date {
  use Types::Common 'Int';
  use Marlin ':UndefTolerant',
    'year?'  => Int,
    'month?' => Int,
    'day?'   => Int;
}

my $xmas = Local::Date->new( day => 25, month => 12, year => undef );
$xmas->has_day;     # true
$xmas->has_month;   # true
$xmas->has_year;    # false

IMPORTING THIS MODULE

The standard way to import Marlin extensions is to include them in the list passed to use Marlin:

package Local::Date {
  use Types::Common 'Int';
  use Marlin ':UndefTolerant',
    'year?'  => Int,
    'month?' => Int,
    'day?'   => Int;
}

It is possible to additionally load it with use Marlin::X::UndefTolerant, which won't do anything, but might be useful to automatic dependency analysis.

package Local::Date {
  use Types::Common 'Int';
  use Marlin::X::UndefTolerant;
  use Marlin ':UndefTolerant',
    'year?'  => Int,
    'month?' => Int,
    'day?'   => Int;
}

DESCRIPTION

Marlin has a built-in feature for making attributes undef-tolerant. It makes the constructor treat attributename => undef as being equivalent to not passing the value to the constructor at all.

However, adding undef_tolerant => true to all your attributes is annoying, so this extension does it for you.

You can override it on a per-attribute basis by setting undef_tolerant => false explicitly.

It will also skip any attributes which:

  • Are required attributes;

  • Have an undef init_arg; or

  • Have an explicit type constraint defined which allows undef as a valid value (for example Maybe[Str] or Bool).

BUGS

Please report any bugs to https://github.com/tobyink/p5-marlin-x-undeftolerant/issues.

SEE ALSO

Marlin.

AUTHOR

Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE

This software is copyright (c) 2026 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

🐟🐟