Coverage Summary

# File Coverage

lib/List/Objects/WithUtils/Role/Array/Typed.pm
Criterion | Covered | Total | %
--- | --- | --- | ---
statement | 15 | 15 | 100.0
branch |  |  | n/a
condition |  |  | n/a
subroutine | 5 | 5 | 100.0
total | 20 | 20 | 100.0

line | stmt | bran | cond | sub | code
--- | --- | --- | --- | --- | ---
1 |  |  |  |  | package List::Objects::WithUtils::Role::Array::Typed;
2 | 14 |  |  | 14 | use strictures 1;
| 14 |  |  |  |
| 14 |  |  |  |
3 |  |  |  |  |
4 | 14 |  |  | 14 | use Carp ();
| 14 |  |  |  |
| 14 |  |  |  |
5 | 14 |  |  | 14 | use Scalar::Util ();
| 14 |  |  |  |
| 14 |  |  |  |
6 | 14 |  |  | 14 | use Type::Tie ();
| 14 |  |  |  |
| 14 |  |  |  |
7 |  |  |  |  |
8 | 14 |  |  | 14 | use Role::Tiny;
| 14 |  |  |  |
| 14 |  |  |  |
9 |  |  |  |  | requires 'type', 'new';
10 |  |  |  |  |
11 |  |  |  |  | around type => sub { tied(@{$_[1]})->type };
12 |  |  |  |  |
13 |  |  |  |  | around new => sub {
14 |  |  |  |  | my (undef, $class, $type) = splice @_, 0, 2;
15 |  |  |  |  |
16 |  |  |  |  | if (my $blessed = Scalar::Util::blessed $class) {
17 |  |  |  |  | $type = $class->type;
18 |  |  |  |  | $class = $blessed;
19 |  |  |  |  | } else {
20 |  |  |  |  | $type = shift;
21 |  |  |  |  | }
22 |  |  |  |  |
23 |  |  |  |  | Carp::confess "Expected a Type::Tiny type but got '$type'"
24 |  |  |  |  | unless Scalar::Util::blessed($type)
25 |  |  |  |  | && $type->isa('Type::Tiny');
26 |  |  |  |  |
27 |  |  |  |  | my $self = [];
28 |  |  |  |  | tie(@$self, 'Type::Tie::ARRAY', $type);
29 |  |  |  |  | push @$self, @_;
30 |  |  |  |  | bless $self, $class;
31 |  |  |  |  | };
32 |  |  |  |  |
33 |  |  |  |  | print
34 |  |  |  |  | qq[<Su-Shee> there are those days when I'm too stupid to loop over a],
35 |  |  |  |  | qq[ simple list of things... I should close my editor now.\n],
36 |  |  |  |  | qq[<dngor> Su-Shee: Hire an iterator. \n],
37 |  |  |  |  | unless caller;
38 |  |  |  |  | 1;
39 |  |  |  |  |
40 |  |  |  |  | =pod
41 |  |  |  |  |
42 |  |  |  |  | =for Pod::Coverage new array_of
43 |  |  |  |  |
44 |  |  |  |  | =head1 NAME
45 |  |  |  |  |
46 |  |  |  |  | List::Objects::WithUtils::Role::Array::Typed - Type-checking array behavior
47 |  |  |  |  |
48 |  |  |  |  | =head1 SYNOPSIS
49 |  |  |  |  |
50 |  |  |  |  | # Via List::Objects::WithUtils::Array::Typed ->
51 |  |  |  |  | use List::Objects::WithUtils 'array_of';
52 |  |  |  |  | use Types::Standard -all;
53 |  |  |  |  | use List::Objects::Types -all;
54 |  |  |  |  |
55 |  |  |  |  | my $arr_of_arrs = array_of( ArrayObj => [], [] );
56 |  |  |  |  |
57 |  |  |  |  | =head1 DESCRIPTION
58 |  |  |  |  |
59 |  |  |  |  | This role makes use of L<Type::Tie> to add type-checking behavior to
60 |  |  |  |  | L<List::Objects::WithUtils::Role::Array> consumers.
61 |  |  |  |  |
62 |  |  |  |  | The first argument passed to the constructor should be a L<Type::Tiny> type:
63 |  |  |  |  |
64 |  |  |  |  | use Types::Standard -all;
65 |  |  |  |  | my $arr = array_of Str() => qw/foo bar baz/;
66 |  |  |  |  |
67 |  |  |  |  | Elements are checked against the specified type when the object is constructed
68 |  |  |  |  | or new elements are added.
69 |  |  |  |  |
70 |  |  |  |  | If the initial type-check fails, a coercion is attempted.
71 |  |  |  |  |
72 |  |  |  |  | Values that cannot be coerced will throw an exception.
73 |  |  |  |  |
74 |  |  |  |  | Also see L<Types::Standard>, L<List::Objects::Types>
75 |  |  |  |  |
76 |  |  |  |  | =head2 type
77 |  |  |  |  |
78 |  |  |  |  | Returns the L<Type::Tiny> type the object was created with.
79 |  |  |  |  |
80 |  |  |  |  | =head1 AUTHOR
81 |  |  |  |  |
82 |  |  |  |  | Jon Portnoy <avenj@cobaltirc.org> with significant contributions from Toby
83 |  |  |  |  | Inkster (CPAN: TOBYINK)
84 |  |  |  |  |
85 |  |  |  |  | =cut
86 |  |  |  |  |