NAME
    MooseX::CustomInitArgs - define multiple init args with custom processing

SYNOPSIS
       package Circle {
          use Moose;
          use MooseX::CustomInitArgs;
      
          has radius => (
             is        => 'ro',
             isa       => 'Num',
             required  => 1,
             init_args => [
                'r',
                'diameter' => sub { $_ / 2 },
             ],
          );
       }
   
       # All three are equivalent...
       my $circle = Circle->new(radius => 1);
       my $circle = Circle->new(r => 1);
       my $circle = Circle->new(diameter => 2);

DESCRIPTION
    `MooseX::CustomInitArgs` allows Moose attributes to be initialized from
    alternative initialization arguments. If you find yourself wishing that
    Moose's built-in `init_arg` option took an arrayref, then this is what you
    want.

    MooseX::MultiInitArg also does this, but `MooseX::CustomInitArgs` has an
    additional feature: it can optionally pre-process each initialization
    argument. This happens prior to type coercian and constraint checks.

    (Also at the time of writing, `MooseX::MultiInitArg` suffers from a bug
    where it breaks when a class is immutablized.)

    The constructor cannot be called with multiple initialization arguments
    for the same attribute. Given the class in the example, this would throw
    an error:

       my $circle = Circle->new(radius => 1, diameter => 100);

    The following would also throw an error, even though it's slightly more
    sensible:

       my $circle = Circle->new(radius => 1, diameter => 2);

    The `init_args` attribute option is conceptually a hash mapping
    initialization argument names to methods which pre-process them. The
    methods can be given as coderefs, or the names of class methods as strings
    (or scalar refs).

    You can provide this hash mapping as an actual hashref, or (as in the
    "SYNOPSIS") as an arrayref suitable for input to Data::OptList. In either
    case it will be coerced to `MooseX::CustomInitArgs`'s internal
    representation which is a `Data::OptList`-style arrayref of arrayrefs.

  Interaction with type constraints and coercion
    Normally, custom init arg coderefs run *before* the value has been through
    type constraint checks and coercions. This allows the coderef to massage
    the value into passing its type constraint checks.

    However, if you wish to run type constraint checks before the coderef, use
    the `after_typecheck` helper:

       init_args => [
          'r',
          'diameter' => after_typecheck { $_ / 2 },
       ],

    (There's a corresponding `before_typecheck` helper for clarity.)

    After the coderef has been run, type constraint checks and coercions will
    happen *again* on the result.

CAVEATS
    `init_args` cannot be used on attributes with `init_arg => undef`.
    `MooseX::CustomInitArgs` will throw an error if you do.

BUGS
    Please report any bugs to
    <http://rt.cpan.org/Dist/Display.html?Queue=MooseX-CustomInitArgs>.

SEE ALSO
    MooseX::MultiInitArg, MooseX::FunkyAttributes.

AUTHOR
    Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE
    This software is copyright (c) 2013 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.