The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Types::DBIx::Class - A Type::Library for DBIx::Class objects

VERSION

version 1.00000

SYNOPSIS

    # Standalone, no object library required
    use Types::DBIx::Class -all;

    if (! is_Schema( $some_obj ) ) { die '$some_obj is not a DBIx Schema ' }

    my $validator = (Row['my_table'])->compiled_check;
    my $is_valid = $validator->( $should_be_a_row_from_my_table );

    ResultSet['some_class']->assert_valid( $results ); # Dies if $results fails

    # in your Moo/Mouse/Moose class
    use Types::DBIx::Class qw(ResultSet Row);

    # non-parameterized usage
    has any_resultset => (
        is  => 'ro',
        isa => ResultSet
    );

    # this attribute must be a DBIx::Class::ResultSet object from your "Album" ResultSet class
    has albums_rs => (
        is  => 'ro',
        isa => ResultSet['Album']
    );

    # this attribute must be a DBIx::Class::Row object from your "Album" Result class
    has album => (
        is  => 'ro',
        isa => Row['Album']
    );

    # subtyping works as expected
    use Type::Library -declare => [qw(RockAlbum DecadeAlbum)];

    subtype RockAlbum,
        as Row['Album'],
        where { $_->genre eq 'Rock' };

    # Further parameterization!
    package Local::MyAlbumTypes;
    use Type::Library -base;
    use Type::Utils -all;

    declare 'DecadeAlbum',
      parent => Row['Album'],
      constraint_generator => sub {
        my ($decade) = @_;
        die "Decade must be an Int between 0 and 100"
          unless $decade =~ /^\d+$/ && $decade < 100;
        $decade = substr($decade,0,1);
        return sub { substr($_->year,-2,1) eq $decade }
      };

    # In another module
    use Moo;
    use Type::Tiny;
    use Local::MyAlbumTypes;

    my $EightiesRock = Type::Tiny->new(
      name       => 'EightiesRock',
      parent     => DecadeAlbum[80],
      constraint => sub { $_->genre eq 'Rock' } );

    has eighties_rock_album => (
        is  => 'ro',
        isa => $EightiesRock,
    );

DESCRIPTION

This simply provides some Type::Tiny style types for often shared DBIx::Class objects. It is forked from, and still borrows heavily from MooseX::Types::DBIx::Class.

TYPES

Each of the types below first ensures the appropriate isa relationship. If the (optional) parameter is specified, it constrains the value further in some way. These types do not define any coercions.

Additionaly, each provieds stand-alone validation subroutines via Type::Tiny, which do not require using an object framework.

ResultSet[$source_name]

This type constraint requires the object to be an instance of DBIx::Class::ResultSet and to have the specified $source_name (if specified).

ResultSource[$source_name]

This type constraint requires the object to be an instance of DBIx::Class::ResultSource and to have the specified $source_name (if specified).

Row[$source_name]

This type constraint requires the object to be an instance of DBIx::Class::Row and to have the specified $source_name (if specified).

Schema[$class_name | qr/pattern_to_match/]

This type constraint is present mostly for completeness and requires the object to be an instance of DBIx::Class::Schema and to have a class name that matches $class_name or the regular expression if specified.

SEE ALSO

Type::Tiny, Type::Library

AUTHOR

  Yary Hluchan <yary@cpan.org>

Authors of the original MooseX::Types::DBIx::Class module, which this module copies from copiously:

  Oliver Charles <oliver@ocharles.org.uk>
  Brian Phillips <bphillips@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Yary Hluchan

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.