NAME

Defaults::Modern - Yet another approach to modernistic Perl

SYNOPSIS

use Defaults::Modern;

# Function::Parameters + List::Objects::WithUtils + types ->
fun to_immutable ( (ArrayRef | ArrayObj) $arr ) {
  # blessed() and confess() are available (amongst others):
  my $immutable = immarray( blessed $arr ? $arr->all : @$arr );
  confess 'No items in array!' unless $immutable->has_any;
  $immutable
}

package My::Foo {
  use Defaults::Modern;

# define keyword for defining constants ->
define ARRAY_MAX = 10;

# Moo(se) with types ->
use Moo;
use MooX::late;

has myarray => (
  isa => ArrayObj,
  is  => 'ro',
  writer  => '_set_myarray',
  # MooX::late allows us to coerce from an ArrayRef:
  coerce  => 1,
  default => sub { [] },
);

  # Method with optional positional param and implicit $self ->
  method slice_to_max (Int $max = -1) {
    my $arr = $self->myarray;
    $self->_set_myarray( 
      $arr->sliced( 0 .. $max >= 0 ? $max : ARRAY_MAX )
    )
  }
}

# Optionally autobox list-type refs via List::Objects::WithUtils ->
use Defaults::Modern 'autobox_lists';
my $obj = +{ foo => 'bar', baz => 'quux' }->inflate;
my $baz = $obj->baz;

# See DESCRIPTION for complete details on imported functionality.

DESCRIPTION

Yet another approach to writing Perl in a modern style.

. . . also saves me extensive typing ;-)

When you use Defaults::Modern, you get:

If you want to automatically load (shown here with the '-all' import tag, as well) and register other Type::Registry compatible libraries (see Type::Library), they can be specified at import time:

use Defaults::Modern
  -all,
  -with_types => [ 'Types::Mine' ],

If you import the tag autobox_lists, ARRAY and HASH type references are autoboxed via List::Objects::WithUtils:

use Defaults::Modern 'autobox_lists';
my $itr = [ 1 .. 10 ]->natatime(2);

Moo and MooX::late are depended upon in order to guarantee their availability, but not automatically imported:

use Moo;
use MooX::late;
use Defaults::Modern;

has foo => (
  is  => 'ro',
  isa => ArrayObj,
  coerce  => 1,
  default => sub { [] },
);

(If you're building classes, you may want to look into namespace::clean / namespace::sweep or similar -- Defaults::Modern imports an awful lot of Stuff. Moops may be nicer to work with.)

## Undocumented for now, because Moops is a better solution.

If you import Moo, you get Moo and MooX::late (but you should really be using Moops instead):

use Defaults::Modern 'Moo';
has foo => (
  is      => 'ro',
  isa     => ArrayObj,
  coerce  => 1,
  default => sub { [] },
);

SEE ALSO

This package just glues together useful parts of CPAN, the most visible portions of which come from the following modules:

Carp

Function::Parameters

List::Objects::WithUtils and List::Objects::Types

match::simple

Path::Tiny

PerlX::Maybe

Scalar::Util

Switch::Plain

Try::Tiny

Types::Standard

Type::Tiny

AUTHOR

Jon Portnoy avenj@cobaltirc.org

Licensed under the same terms as Perl.

Inspired by Defaults::Mauke and Moops.

The code backing the define keyword is forked from TOBYINK's PerlX::Define to avoid the Moops dependency and is copyright Toby Inkster.