File Coverage

blib/lib/Git/PurePerl/Walker/Role/HasRepo.pm
Criterion Covered Total %
statement 20 20 100.0
branch n/a
condition n/a
subroutine 7 7 100.0
pod 1 1 100.0
total 28 28 100.0


line stmt bran cond sub pod time code
1 12     12   5875 use 5.006; #our
  12         28  
2 12     12   51 use strict;
  12         13  
  12         199  
3 12     12   37 use warnings;
  12         17  
  12         634  
4              
5             package Git::PurePerl::Walker::Role::HasRepo;
6              
7             our $VERSION = '0.004001';
8              
9             # ABSTRACT: An entity that has a repo
10              
11             our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
12              
13 12     12   439 use Moose::Role qw( with has );
  12         299772  
  12         55  
14 12     12   33743 use Git::PurePerl::Walker::Types qw( GPPW_Repository );
  12         30  
  12         65  
15              
16              
17              
18              
19              
20              
21              
22              
23              
24              
25              
26              
27              
28             with qw( MooseX::Clone );
29              
30              
31              
32              
33              
34              
35              
36              
37              
38             has '_repo' => ( isa => GPPW_Repository, is => 'rw', weak_ref => 1 );
39              
40              
41              
42              
43              
44              
45              
46              
47              
48              
49              
50              
51              
52              
53              
54              
55              
56              
57              
58              
59              
60              
61              
62              
63              
64              
65             sub for_repository {
66 9     9 1 40 my ( $self, $repo ) = @_;
67 9         50 my $clone = $self->clone( _repo => $repo, );
68 9         12820 return $clone;
69             }
70              
71 12     12   31921 no Moose::Role;
  12         16  
  12         139  
72             1;
73              
74             __END__
75              
76             =pod
77              
78             =encoding UTF-8
79              
80             =head1 NAME
81              
82             Git::PurePerl::Walker::Role::HasRepo - An entity that has a repo
83              
84             =head1 VERSION
85              
86             version 0.004001
87              
88             =head1 DESCRIPTION
89              
90             This is a composition role consumed by other roles to provide them with a
91             private repo property.
92              
93             This role also folds in L<< C<MooseX::B<Clone>>|MooseX::Clone >> and provides the 'for_repository'
94             method which sets the repo property.
95              
96             package Foo {
97             use Moose;
98             with 'Git::PurePerl::Walker::Role::HasRepo';
99             __PACKAGE__->meta->make_immutable;
100             }
101              
102             my $factory = Foo->new( %args );
103              
104             my $instance = $factory->for_repository( $Git_PurePerl_Repo );
105              
106             =head1 METHODS
107              
108             =head2 for_repository
109              
110             Construct an entity for a given repository.
111              
112             This internally calls L<< C<MooseX::B<Clone>>|MooseX::Clone >> on the current object, passing the _repo
113             field to its constructor, producing a separate, disconnected object to work
114             with.
115              
116             The rationale behind this is simple: Its very likely users will want one set of
117             settings for a consuming class, but they'll want to use those same settings with
118             multiple repositories.
119              
120             And as each repository will need to maintain its own state for traversal, they
121             have to normally manually construct an object for each repository, manually
122             disconnecting the constructor arguments.
123              
124             This instead is simple:
125              
126             my $thing = Thing->new( %args );
127             my ( @foos ) = map { $thing->for_repository( $_ ) } @repos;
128              
129             And now all C<@foos> can be mangled independently.
130              
131             =head1 INHERITED METHODS
132              
133             =head2 clone
134              
135             L<< C<MooseX::B<Clone>-E<gt>I<clone( %params )>>|MooseX::Clone/clone-params >>
136              
137             =head1 PRIVATE ATTRIBUTES
138              
139             =head2 _repo
140              
141             =head1 PRIVATE ATTRIBUTE GENERATED METHODS
142              
143             =head2 _repo
144              
145             =head1 CONSUMED ROLES
146              
147             =head2 MooseX::Clone
148              
149             L<< C<MooseX::B<Clone>>|MooseX::Clone >>
150              
151             =head1 AUTHOR
152              
153             Kent Fredric <kentnl@cpan.org>
154              
155             =head1 COPYRIGHT AND LICENSE
156              
157             This software is copyright (c) 2017 by Kent Fredric <kentnl@cpan.org>.
158              
159             This is free software; you can redistribute it and/or modify it under
160             the same terms as the Perl 5 programming language system itself.
161              
162             =cut