use warnings
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / POD.pm
CommitLineData
2a267f86 1package SQL::Translator::Producer::POD;
2
20770e44 3=head1 NAME
4
5SQL::Translator::Producer::POD - POD producer for SQL::Translator
6
7=head1 SYNOPSIS
8
9 use SQL::Translator;
10
11 my $t = SQL::Translator->new( parser => '...', producer => 'POD', '...' );
12 print $t->translate;
13
14=head1 DESCRIPTION
15
ea93df61 16Creates a POD description of each table, field, index, and constraint.
17A good starting point for text documentation of a schema. You can
18easily convert the output to HTML or text using "perldoc" or other
20770e44 19interesting formats using Pod::POM or Template::Toolkit's POD plugin.
20
21=cut
22
2a267f86 23use strict;
f27f9229 24use warnings;
da06ac74 25use vars qw[ $VERSION ];
11ad2df9 26$VERSION = '1.59';
2a267f86 27
28use SQL::Translator::Schema::Constants;
29use SQL::Translator::Utils qw(header_comment);
30
2a267f86 31sub produce {
32 my $t = shift;
33 my $schema = $t->schema;
34 my $schema_name = $schema->name || 'Schema';
35 my $args = $t->producer_args;
cb002bb5 36 my $title = $args->{'title'} || $schema_name;
2a267f86 37
cb002bb5 38 my $pod = "=pod\n\n=head1 DESCRIPTION\n\n$title\n\n=head1 TABLES\n\n";
2a267f86 39
40 for my $table ( $schema->get_tables ) {
41 my $table_name = $table->name or next;
42 my @fields = $table->get_fields or next;
43 $pod .= "=head2 $table_name\n\n=head3 FIELDS\n\n";
44
45 #
46 # Fields
47 #
b9124e4b 48 for my $field ( @fields ) {
2a267f86 49 $pod .= "=head4 " . $field->name . "\n\n=over 4\n\n";
50
51 my $data_type = $field->data_type;
52 my $size = $field->size;
53 $data_type .= "($size)" if $size;
54
55 $pod .= "=item * $data_type\n\n";
56 $pod .= "=item * PRIMARY KEY\n\n" if $field->is_primary_key;
57
58 my $default = $field->default_value;
59 $pod .= "=item * Default '$default' \n\n" if defined $default;
60
61 $pod .= sprintf( "=item * Nullable '%s' \n\n",
62 $field->is_nullable ? 'Yes' : 'No' );
63
64 $pod .= "=back\n\n";
65 }
66
67 #
68 # Indices
69 #
70 if ( my @indices = $table->get_indices ) {
71 $pod .= "=head3 INDICES\n\n";
72 for my $index ( @indices ) {
73 $pod .= "=head4 " . $index->type . "\n\n=over 4\n\n";
ea93df61 74 $pod .= "=item * Fields = " .
2a267f86 75 join(', ', $index->fields ) . "\n\n";
76 $pod .= "=back\n\n";
77 }
78 }
79
80 #
81 # Constraints
82 #
83 if ( my @constraints = $table->get_constraints ) {
84 $pod .= "=head3 CONSTRAINTS\n\n";
85 for my $c ( @constraints ) {
86 $pod .= "=head4 " . $c->type . "\n\n=over 4\n\n";
ea93df61 87 $pod .= "=item * Fields = " .
2a267f86 88 join(', ', $c->fields ) . "\n\n";
89
90 if ( $c->type eq FOREIGN_KEY ) {
ea93df61 91 $pod .= "=item * Reference Table = L</" .
b9124e4b 92 $c->reference_table . ">\n\n";
ea93df61 93 $pod .= "=item * Reference Fields = " .
94 join(', ', map {"L</$_>"} $c->reference_fields ) .
b9124e4b 95 "\n\n";
2a267f86 96 }
97
98 if ( my $update = $c->on_update ) {
4e4608c6 99 $pod .= "=item * On update = $update\n\n";
2a267f86 100 }
101
102 if ( my $delete = $c->on_delete ) {
4e4608c6 103 $pod .= "=item * On delete = $delete\n\n";
2a267f86 104 }
105
106 $pod .= "=back\n\n";
107 }
108 }
109 }
110
b9124e4b 111 my $header = ( map { $_ || () } split( /\n/, header_comment('', '') ) )[0];
112 $header =~ s/^Created by //;
113 $pod .= "=head1 PRODUCED BY\n\n$header\n\n=cut";
114
2a267f86 115 return $pod;
116}
117
1181;
119
120# -------------------------------------------------------------------
121# Expect poison from the standing water.
122# William Blake
123# -------------------------------------------------------------------
124
20770e44 125=pod
2a267f86 126
127=head1 AUTHOR
128
f997b9ab 129Ken Youens-Clark E<lt>kclark@cpan.orgE<gt>.
2a267f86 130
38ecb2bf 131=head2 CONTRIBUTORS
132
133Jonathan Yu E<lt>frequency@cpan.orgE<gt>
134
2a267f86 135=head1 SEE ALSO
136
20770e44 137perldoc, perlpod, Pod::POM, Template::Manual::Plugins.
2a267f86 138
139=cut