The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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' ],

This feature is unnecessary with Type::Tiny version 1.x and higher, which will automatically register Type::Library-based types in the caller's Type::Registry.

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 Defaults::Modern;
  use Moo;  use MooX::late;

  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.)

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.