use strict;
use warnings;

package Parse::Method::Signatures::Types;

use Moose::Util::TypeConstraints;
use MooseX::Types::Moose qw/Str ArrayRef/;
use namespace::clean;

use MooseX::Types -declare => [qw/
    VariableName
    TypeConstraint
    Param
    ParamCollection
    PositionalParam
    NamedParam
    UnpackedParam
/];

subtype VariableName,
    as Str,
    where { /^[\$@%](?:[a-z_][a-z_\d]*)?$/i },
    message { 'not a valid variable name' };

subtype TypeConstraint,
    as 'Moose::Meta::TypeConstraint';

class_type Param, { class => 'Parse::Method::Signatures::Param' };

class_type ParamCollection, { class => 'Parse::Method::Signatures::ParamCollection' };

coerce ParamCollection,
    from ArrayRef,
    via { Parse::Method::Signatures::ParamCollection->new(params => $_) };

role_type PositionalParam, { role => 'Parse::Method::Signatures::Param::Positional' };
role_type NamedParam,      { role => 'Parse::Method::Signatures::Param::Named'      };
role_type UnpackedParam,   { role => 'Parse::Method::Signatures::Param::Unpacked'   };

1;