Salvation-TC
view release on metacpan or search on metacpan
lib/Salvation/TC/Utils.pm view on Meta::CPAN
=head2 where( CodeRef $code )
=cut
sub where( & ) { ## no critic (ProhibitSubroutinePrototypes)
my ( $code ) = @_;
return ( validator => sub {
my ( $type_name ) = @_;
return sub {
local $_ = $_[ 0 ];
$code -> () || Salvation::TC::Exception::WrongType -> throw(
type => $type_name, value => $_
);
};
} );
}
=head2 subtype( Str $name, Salvation::TC::Meta::Type :$parent!, CodeRef :$validator! )
ÐбÑÑвлÑÐµÑ Ð½Ð¾Ð²Ñй Ñип, наÑледÑемÑй Ð¾Ñ Ð´ÑÑгого, Ñже ÑÑÑеÑÑвÑÑÑего, Ñипа.
ÐÑедполагаемое иÑполÑзование:
subtype 'ChildTypeName',
as 'ParentTypeName',
where { check_value_and_return_true_or_false( $_ ) };
Ðлок кода, пеÑеданнÑй во C<where>, бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð² C<$_> знаÑение, коÑоÑое
необÑ
одимо пÑовеÑиÑÑ Ð½Ð° ÑооÑвеÑÑÑвие обÑÑвлÑÐµÐ¼Ð¾Ð¼Ñ ÑипÑ, и должен веÑнÑÑÑ
C<true> еÑли знаÑение подÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ Ñип, или C<false>, еÑли знаÑение не подÑ
одиÑ.
ТеÑ
ниÑеÑки ÑнаÑала бÑÐ´ÐµÑ Ð²Ñполнена пÑовеÑка знаÑÐµÐ½Ð¸Ñ Ð½Ð° ÑооÑвеÑÑÑвие
ÑодиÑелÑÑÐºÐ¾Ð¼Ñ ÑипÑ, и ÑолÑко еÑли ÑÑа пÑовеÑка пÑоÑла ÑÑпеÑно - бÑдеÑ
вÑполнена пÑовеÑка ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð´Ð¾ÑеÑÐ½ÐµÐ¼Ñ ÑипÑ. ÐÑо гаÑанÑиÑÑеÑ, ÑÑо в C<$_>
Ñ C<where> Ñипа C<ChildTypeName> вÑегда бÑÐ´ÐµÑ Ð½Ð°Ñ
одиÑÑÑÑ Ð·Ð½Ð°Ñение Ñипа
C<ParentTypeName>.
=cut
sub subtype {
my ( $name, %params ) = @_;
die( "Type ${name} is already present" ) if( Salvation::TC -> get_type( $name ) );
Salvation::TC -> setup_type( $name => (
validator => $params{ 'validator' } -> ( $name ),
parent => $params{ 'parent' },
) );
}
=head2 as( Str $type )
=cut
sub as( $ ) { ## no critic (ProhibitSubroutinePrototypes)
my ( $type ) = @_;
return ( parent => Salvation::TC -> get( $type ) );
}
=head2 enum( Str $name, ArrayRef[Str] $values )
Ð¥ÑÐ»Ð¿ÐµÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ enum'ов знаÑений Ñипа C<Str>. ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ:
enum 'RGB', [ 'red', 'green', 'blue' ];
=cut
sub enum {
my ( $name, $values ) = @_;
subtype $name,
as 'Str',
where {
my $input = $_;
foreach ( @$values ) {
return true if( $_ eq $input );
}
return false;
};
}
1;
__END__
( run in 2.542 seconds using v1.01-cache-2.11-cpan-9789f410c06 )