File Coverage

lib/BoutrosLab/TSVStream/IO/Role/Writer/Dyn.pm
Criterion Covered Total %
statement 21 25 84.0
branch n/a
condition n/a
subroutine 7 8 87.5
pod n/a
total 28 33 84.8


line stmt bran cond sub pod time code
1             package BoutrosLab::TSVStream::IO::Role::Writer::Dyn;
2              
3             # safe Perl
4 1     1   4 use warnings;
  1         1  
  1         24  
5 1     1   3 use strict;
  1         1  
  1         12  
6 1     1   3 use Carp;
  1         0  
  1         40  
7              
8 1     1   372 use BoutrosLab::TSVStream::IO::Role::Writer::Fixed;
  1         2  
  1         29  
9              
10             =head1 NAME
11              
12             BoutrosLab::TSVStream:Writer
13              
14             =cut
15              
16 1     1   4 use Moose::Role;
  1         1  
  1         4  
17 1     1   3200 use Moose::Util::TypeConstraints;
  1         1  
  1         3  
18 1     1   1293 use namespace::autoclean;
  1         2  
  1         3  
19              
20             with 'BoutrosLab::TSVStream::IO::Role::Writer::Fixed' => { -excludes => '_list_headers' };
21              
22             sub _list_headers {
23 0     0     my $self = shift;
24 0           return ( [ @{ $self->fields }, @{ $self->dyn_fields } ] );
  0            
  0            
25             }
26              
27             =head1 SYNOPSIS
28              
29             $class->writer( ... );
30              
31             # ($class will use the role BoutrosLab::TSVStream which will provide
32             # the writer method, that method will return a Writer object with:
33             # ...
34             # return BoutrosLab::TSVStream::Writer->new(
35             # handle => $fd, # (required)
36             # class => $class, # (required) class
37             # file => $file, # (optional) used (as filename) in error messages
38             # header => $str, # (optional) one of: write skip (default 'write' unless append)
39             # append => 1, # (optional) if true:
40             # # file is opened for append (if stream not provided)
41             # # header defaults to 'skip'
42             # );
43              
44             while (my $record = $writer->read) {
45             # ... $record is a $class object
46             # ... use $record->field1, $record->field2, etc. - all of the methods of $class object
47             }
48              
49             =head1 DESCRIPTION
50              
51             This object provides an iterator to read through the lines
52             of a data stream (C<$fd>), converting each from a line with
53             tab separated fields into an object of a class (C<$classs>)
54             that has attributes for those fields.
55              
56             Usually, the data stream will start with a line that has the
57             fieldnames in a tab separated list, and the rest of the stream
58             has lines that contain the field values in a tab separated list.
59              
60             Any error diagnostics will refer to the stream using the
61             C<$file> filename if it is provided.
62              
63             The C<$class> class will have a class method named C<_fields>
64             that provides a ref to array of string listing the fields to
65             .be written and their order.
66              
67             A class C<$class> object must be provided for each line.
68             The object will be re-formatted into tab separated format
69             and written out.
70              
71             If C<header> is provided, it can be 'write', or 'skip'.
72             This controls what is done to the handle initially.
73              
74             If 'write' is specified, a header line is written to the stream
75             containing the field names in tab separated format before writing
76             any explicitly provided objects. This is the default. If 'skip'
77             is specified, no header is written.
78              
79             If 'skip' is specified, the stream is not checked for a header
80             line. (You would use this option either if the file does not
81             have a header line, or if you are scanning from the middle of
82             a file handle that is no longer at the start of the file.)
83              
84             =head1 ATTRIBUTES
85              
86             =head2 handle - the filehandle to be read
87              
88             =head2 file - the name of the stream, usually a filename, for diagnostic purposes
89              
90             =head2 class - the class that records transformed into
91              
92             =head2 fields - list of field names, usually provided by class
93              
94             handle, file, class and fields are provided by the ...::IO::Role::Base::Fixed role
95              
96             =head2 append - (optional) boolean to cause writes to append to the stream, causes header to default to 'skip'
97              
98             =head2 header - 'write', or 'skip' (default 'write' normally, 'skip' if 'append' is enabled)
99              
100             The C<'write'> setting causes the first line of the stream to be written
101             with a list of field names. This is the default unless the append option
102             is set.
103              
104             If the C<'skip'> setting is provided, the stream writing will start with
105             a data value. Use this either for writing a stream that is not supposed
106             to have a header line, or else to append additional values to an existing
107             file (of the same type of course). This must normally be asked for
108             explicitly, but it is the default if the append option is set.
109              
110             =head1 BUILDARGS
111              
112             The BUILDARGS method opens a handle if only a file is provided.
113              
114             =head1 BUILD
115              
116             The BUILD method handles any requirements for reading and processing a
117             header line.
118              
119             =head1 METHODS
120              
121             =head2 write - read a line to the stream from a class element
122              
123             #####
124              
125             =head1 AUTHOR
126              
127             John Macdonald - Boutros Lab
128              
129             =head1 ACKNOWLEDGEMENTS
130              
131             Paul Boutros, Phd, PI - Boutros Lab
132              
133             The Ontario Institute for Cancer Research
134              
135             =cut
136              
137             1;
138