Skip to content
This repository
Browse code

Adding Dev Files

The end-user repo is now in the folder Hypatia-$version. The files
outside of it are what Dist::Zilla uses for a build.
  • Loading branch information...
commit 2ae5a2ce7b8e3a3e8ef68e4ff1352575b140f4d4 1 parent 2828305
authored September 13, 2012
179  .gitignore
... ...
@@ -1,163 +1,16 @@
1  
-#################
2  
-## Eclipse
3  
-#################
4  
-
5  
-*.pydevproject
6  
-.project
7  
-.metadata
8  
-bin/
9  
-tmp/
10  
-*.tmp
11  
-*.bak
12  
-*.swp
13  
-*~.nib
14  
-local.properties
15  
-.classpath
16  
-.settings/
17  
-.loadpath
18  
-
19  
-# External tool builders
20  
-.externalToolBuilders/
21  
-
22  
-# Locally stored "Eclipse launch configurations"
23  
-*.launch
24  
-
25  
-# CDT-specific
26  
-.cproject
27  
-
28  
-# PDT-specific
29  
-.buildpath
30  
-
31  
-
32  
-#################
33  
-## Visual Studio
34  
-#################
35  
-
36  
-## Ignore Visual Studio temporary files, build results, and
37  
-## files generated by popular Visual Studio add-ons.
38  
-
39  
-# User-specific files
40  
-*.suo
41  
-*.user
42  
-*.sln.docstates
43  
-
44  
-# Build results
45  
-[Dd]ebug/
46  
-[Rr]elease/
47  
-*_i.c
48  
-*_p.c
49  
-*.ilk
50  
-*.meta
51  
-*.obj
52  
-*.pch
53  
-*.pdb
54  
-*.pgc
55  
-*.pgd
56  
-*.rsp
57  
-*.sbr
58  
-*.tlb
59  
-*.tli
60  
-*.tlh
61  
-*.tmp
62  
-*.vspscc
63  
-.builds
64  
-*.dotCover
65  
-
66  
-## TODO: If you have NuGet Package Restore enabled, uncomment this
67  
-#packages/
68  
-
69  
-# Visual C++ cache files
70  
-ipch/
71  
-*.aps
72  
-*.ncb
73  
-*.opensdf
74  
-*.sdf
75  
-
76  
-# Visual Studio profiler
77  
-*.psess
78  
-*.vsp
79  
-
80  
-# ReSharper is a .NET coding add-in
81  
-_ReSharper*
82  
-
83  
-# Installshield output folder
84  
-[Ee]xpress
85  
-
86  
-# DocProject is a documentation generator add-in
87  
-DocProject/buildhelp/
88  
-DocProject/Help/*.HxT
89  
-DocProject/Help/*.HxC
90  
-DocProject/Help/*.hhc
91  
-DocProject/Help/*.hhk
92  
-DocProject/Help/*.hhp
93  
-DocProject/Help/Html2
94  
-DocProject/Help/html
95  
-
96  
-# Click-Once directory
97  
-publish
98  
-
99  
-# Others
100  
-[Bb]in
101  
-[Oo]bj
102  
-sql
103  
-TestResults
104  
-*.Cache
105  
-ClientBin
106  
-stylecop.*
107  
-~$*
108  
-*.dbmdl
109  
-Generated_Code #added for RIA/Silverlight projects
110  
-
111  
-# Backup & report files from converting an old project file to a newer
112  
-# Visual Studio version. Backup files are not needed, because we have git ;-)
113  
-_UpgradeReport_Files/
114  
-Backup*/
115  
-UpgradeLog*.XML
116  
-
117  
-
118  
-
119  
-############
120  
-## Windows
121  
-############
122  
-
123  
-# Windows image file caches
124  
-Thumbs.db
125  
-
126  
-# Folder config file
127  
-Desktop.ini
128  
-
129  
-
130  
-#############
131  
-## Python
132  
-#############
133  
-
134  
-*.py[co]
135  
-
136  
-# Packages
137  
-*.egg
138  
-*.egg-info
139  
-dist
140  
-build
141  
-eggs
142  
-parts
143  
-bin
144  
-var
145  
-sdist
146  
-develop-eggs
147  
-.installed.cfg
148  
-
149  
-# Installer logs
150  
-pip-log.txt
151  
-
152  
-# Unit test / coverage reports
153  
-.coverage
154  
-.tox
155  
-
156  
-#Translations
157  
-*.mo
158  
-
159  
-#Mr Developer
160  
-.mr.developer.cfg
161  
-
162  
-# Mac crap
163  
-.DS_Store
  1
+blib/
  2
+.build/
  3
+_build/
  4
+cover_db/
  5
+inc/
  6
+Build
  7
+Build.bat
  8
+.last_cover_stats
  9
+Makefile
  10
+Makefile.old
  11
+MANIFEST.bak
  12
+META.yml
  13
+MYMETA.yml
  14
+nytprof.out
  15
+pm_to_blib
  16
+*.tar.gz
6  Changes
... ...
@@ -1,7 +1,5 @@
1  
-Revision history for Hypatia
  1
+Revision history for {{$dist->name}}
2 2
 
3  
-0.021     2012-09-12 20:28:12 America/Chicago
4  
-
5  
-0.021     2012-09-12 20:27:36 America/Chicago
  3
+{{$NEXT}}
6 4
 
7 5
  - Fixed a bug that prevents the no_connect.t test of Hypatia::Chart::Clicker from passing.
5  Hypatia-0.021/Changes
... ...
@@ -0,0 +1,5 @@
  1
+Revision history for Hypatia
  2
+
  3
+0.021     2012-09-13 15:57:43 America/Chicago
  4
+
  5
+ - Fixed a bug that prevents the no_connect.t test of Hypatia::Chart::Clicker from passing.
379  Hypatia-0.021/LICENSE
... ...
@@ -0,0 +1,379 @@
  1
+This software is copyright (c) 2012 by Jack Maney.
  2
+
  3
+This is free software; you can redistribute it and/or modify it under
  4
+the same terms as the Perl 5 programming language system itself.
  5
+
  6
+Terms of the Perl programming language system itself
  7
+
  8
+a) the GNU General Public License as published by the Free
  9
+   Software Foundation; either version 1, or (at your option) any
  10
+   later version, or
  11
+b) the "Artistic License"
  12
+
  13
+--- The GNU General Public License, Version 1, February 1989 ---
  14
+
  15
+This software is Copyright (c) 2012 by Jack Maney.
  16
+
  17
+This is free software, licensed under:
  18
+
  19
+  The GNU General Public License, Version 1, February 1989
  20
+
  21
+                    GNU GENERAL PUBLIC LICENSE
  22
+                     Version 1, February 1989
  23
+
  24
+ Copyright (C) 1989 Free Software Foundation, Inc.
  25
+ 51 Franklin St, Suite 500, Boston, MA  02110-1335  USA
  26
+
  27
+ Everyone is permitted to copy and distribute verbatim copies
  28
+ of this license document, but changing it is not allowed.
  29
+
  30
+                            Preamble
  31
+
  32
+  The license agreements of most software companies try to keep users
  33
+at the mercy of those companies.  By contrast, our General Public
  34
+License is intended to guarantee your freedom to share and change free
  35
+software--to make sure the software is free for all its users.  The
  36
+General Public License applies to the Free Software Foundation's
  37
+software and to any other program whose authors commit to using it.
  38
+You can use it for your programs, too.
  39
+
  40
+  When we speak of free software, we are referring to freedom, not
  41
+price.  Specifically, the General Public License is designed to make
  42
+sure that you have the freedom to give away or sell copies of free
  43
+software, that you receive source code or can get it if you want it,
  44
+that you can change the software or use pieces of it in new free
  45
+programs; and that you know you can do these things.
  46
+
  47
+  To protect your rights, we need to make restrictions that forbid
  48
+anyone to deny you these rights or to ask you to surrender the rights.
  49
+These restrictions translate to certain responsibilities for you if you
  50
+distribute copies of the software, or if you modify it.
  51
+
  52
+  For example, if you distribute copies of a such a program, whether
  53
+gratis or for a fee, you must give the recipients all the rights that
  54
+you have.  You must make sure that they, too, receive or can get the
  55
+source code.  And you must tell them their rights.
  56
+
  57
+  We protect your rights with two steps: (1) copyright the software, and
  58
+(2) offer you this license which gives you legal permission to copy,
  59
+distribute and/or modify the software.
  60
+
  61
+  Also, for each author's protection and ours, we want to make certain
  62
+that everyone understands that there is no warranty for this free
  63
+software.  If the software is modified by someone else and passed on, we
  64
+want its recipients to know that what they have is not the original, so
  65
+that any problems introduced by others will not reflect on the original
  66
+authors' reputations.
  67
+
  68
+  The precise terms and conditions for copying, distribution and
  69
+modification follow.
  70
+
  71
+                    GNU GENERAL PUBLIC LICENSE
  72
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  73
+
  74
+  0. This License Agreement applies to any program or other work which
  75
+contains a notice placed by the copyright holder saying it may be
  76
+distributed under the terms of this General Public License.  The
  77
+"Program", below, refers to any such program or work, and a "work based
  78
+on the Program" means either the Program or any work containing the
  79
+Program or a portion of it, either verbatim or with modifications.  Each
  80
+licensee is addressed as "you".
  81
+
  82
+  1. You may copy and distribute verbatim copies of the Program's source
  83
+code as you receive it, in any medium, provided that you conspicuously and
  84
+appropriately publish on each copy an appropriate copyright notice and
  85
+disclaimer of warranty; keep intact all the notices that refer to this
  86
+General Public License and to the absence of any warranty; and give any
  87
+other recipients of the Program a copy of this General Public License
  88
+along with the Program.  You may charge a fee for the physical act of
  89
+transferring a copy.
  90
+
  91
+  2. You may modify your copy or copies of the Program or any portion of
  92
+it, and copy and distribute such modifications under the terms of Paragraph
  93
+1 above, provided that you also do the following:
  94
+
  95
+    a) cause the modified files to carry prominent notices stating that
  96
+    you changed the files and the date of any change; and
  97
+
  98
+    b) cause the whole of any work that you distribute or publish, that
  99
+    in whole or in part contains the Program or any part thereof, either
  100
+    with or without modifications, to be licensed at no charge to all
  101
+    third parties under the terms of this General Public License (except
  102
+    that you may choose to grant warranty protection to some or all
  103
+    third parties, at your option).
  104
+
  105
+    c) If the modified program normally reads commands interactively when
  106
+    run, you must cause it, when started running for such interactive use
  107
+    in the simplest and most usual way, to print or display an
  108
+    announcement including an appropriate copyright notice and a notice
  109
+    that there is no warranty (or else, saying that you provide a
  110
+    warranty) and that users may redistribute the program under these
  111
+    conditions, and telling the user how to view a copy of this General
  112
+    Public License.
  113
+
  114
+    d) You may charge a fee for the physical act of transferring a
  115
+    copy, and you may at your option offer warranty protection in
  116
+    exchange for a fee.
  117
+
  118
+Mere aggregation of another independent work with the Program (or its
  119
+derivative) on a volume of a storage or distribution medium does not bring
  120
+the other work under the scope of these terms.
  121
+
  122
+  3. You may copy and distribute the Program (or a portion or derivative of
  123
+it, under Paragraph 2) in object code or executable form under the terms of
  124
+Paragraphs 1 and 2 above provided that you also do one of the following:
  125
+
  126
+    a) accompany it with the complete corresponding machine-readable
  127
+    source code, which must be distributed under the terms of
  128
+    Paragraphs 1 and 2 above; or,
  129
+
  130
+    b) accompany it with a written offer, valid for at least three
  131
+    years, to give any third party free (except for a nominal charge
  132
+    for the cost of distribution) a complete machine-readable copy of the
  133
+    corresponding source code, to be distributed under the terms of
  134
+    Paragraphs 1 and 2 above; or,
  135
+
  136
+    c) accompany it with the information you received as to where the
  137
+    corresponding source code may be obtained.  (This alternative is
  138
+    allowed only for noncommercial distribution and only if you
  139
+    received the program in object code or executable form alone.)
  140
+
  141
+Source code for a work means the preferred form of the work for making
  142
+modifications to it.  For an executable file, complete source code means
  143
+all the source code for all modules it contains; but, as a special
  144
+exception, it need not include source code for modules which are standard
  145
+libraries that accompany the operating system on which the executable
  146
+file runs, or for standard header files or definitions files that
  147
+accompany that operating system.
  148
+
  149
+  4. You may not copy, modify, sublicense, distribute or transfer the
  150
+Program except as expressly provided under this General Public License.
  151
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
  152
+the Program is void, and will automatically terminate your rights to use
  153
+the Program under this License.  However, parties who have received
  154
+copies, or rights to use copies, from you under this General Public
  155
+License will not have their licenses terminated so long as such parties
  156
+remain in full compliance.
  157
+
  158
+  5. By copying, distributing or modifying the Program (or any work based
  159
+on the Program) you indicate your acceptance of this license to do so,
  160
+and all its terms and conditions.
  161
+
  162
+  6. Each time you redistribute the Program (or any work based on the
  163
+Program), the recipient automatically receives a license from the original
  164
+licensor to copy, distribute or modify the Program subject to these
  165
+terms and conditions.  You may not impose any further restrictions on the
  166
+recipients' exercise of the rights granted herein.
  167
+
  168
+  7. The Free Software Foundation may publish revised and/or new versions
  169
+of the General Public License from time to time.  Such new versions will
  170
+be similar in spirit to the present version, but may differ in detail to
  171
+address new problems or concerns.
  172
+
  173
+Each version is given a distinguishing version number.  If the Program
  174
+specifies a version number of the license which applies to it and "any
  175
+later version", you have the option of following the terms and conditions
  176
+either of that version or of any later version published by the Free
  177
+Software Foundation.  If the Program does not specify a version number of
  178
+the license, you may choose any version ever published by the Free Software
  179
+Foundation.
  180
+
  181
+  8. If you wish to incorporate parts of the Program into other free
  182
+programs whose distribution conditions are different, write to the author
  183
+to ask for permission.  For software which is copyrighted by the Free
  184
+Software Foundation, write to the Free Software Foundation; we sometimes
  185
+make exceptions for this.  Our decision will be guided by the two goals
  186
+of preserving the free status of all derivatives of our free software and
  187
+of promoting the sharing and reuse of software generally.
  188
+
  189
+                            NO WARRANTY
  190
+
  191
+  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  192
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  193
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  194
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  195
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  196
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  197
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  198
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  199
+REPAIR OR CORRECTION.
  200
+
  201
+  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  202
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  203
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  204
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  205
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  206
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  207
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  208
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  209
+POSSIBILITY OF SUCH DAMAGES.
  210
+
  211
+                     END OF TERMS AND CONDITIONS
  212
+
  213
+        Appendix: How to Apply These Terms to Your New Programs
  214
+
  215
+  If you develop a new program, and you want it to be of the greatest
  216
+possible use to humanity, the best way to achieve this is to make it
  217
+free software which everyone can redistribute and change under these
  218
+terms.
  219
+
  220
+  To do so, attach the following notices to the program.  It is safest to
  221
+attach them to the start of each source file to most effectively convey
  222
+the exclusion of warranty; and each file should have at least the
  223
+"copyright" line and a pointer to where the full notice is found.
  224
+
  225
+    <one line to give the program's name and a brief idea of what it does.>
  226
+    Copyright (C) 19yy  <name of author>
  227
+
  228
+    This program is free software; you can redistribute it and/or modify
  229
+    it under the terms of the GNU General Public License as published by
  230
+    the Free Software Foundation; either version 1, or (at your option)
  231
+    any later version.
  232
+
  233
+    This program is distributed in the hope that it will be useful,
  234
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
  235
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  236
+    GNU General Public License for more details.
  237
+
  238
+    You should have received a copy of the GNU General Public License
  239
+    along with this program; if not, write to the Free Software
  240
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
  241
+
  242
+
  243
+Also add information on how to contact you by electronic and paper mail.
  244
+
  245
+If the program is interactive, make it output a short notice like this
  246
+when it starts in an interactive mode:
  247
+
  248
+    Gnomovision version 69, Copyright (C) 19xx name of author
  249
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  250
+    This is free software, and you are welcome to redistribute it
  251
+    under certain conditions; type `show c' for details.
  252
+
  253
+The hypothetical commands `show w' and `show c' should show the
  254
+appropriate parts of the General Public License.  Of course, the
  255
+commands you use may be called something other than `show w' and `show
  256
+c'; they could even be mouse-clicks or menu items--whatever suits your
  257
+program.
  258
+
  259
+You should also get your employer (if you work as a programmer) or your
  260
+school, if any, to sign a "copyright disclaimer" for the program, if
  261
+necessary.  Here a sample; alter the names:
  262
+
  263
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  264
+  program `Gnomovision' (a program to direct compilers to make passes
  265
+  at assemblers) written by James Hacker.
  266
+
  267
+  <signature of Ty Coon>, 1 April 1989
  268
+  Ty Coon, President of Vice
  269
+
  270
+That's all there is to it!
  271
+
  272
+
  273
+--- The Artistic License 1.0 ---
  274
+
  275
+This software is Copyright (c) 2012 by Jack Maney.
  276
+
  277
+This is free software, licensed under:
  278
+
  279
+  The Artistic License 1.0
  280
+
  281
+The Artistic License
  282
+
  283
+Preamble
  284
+
  285
+The intent of this document is to state the conditions under which a Package
  286
+may be copied, such that the Copyright Holder maintains some semblance of
  287
+artistic control over the development of the package, while giving the users of
  288
+the package the right to use and distribute the Package in a more-or-less
  289
+customary fashion, plus the right to make reasonable modifications.
  290
+
  291
+Definitions:
  292
+
  293
+  - "Package" refers to the collection of files distributed by the Copyright
  294
+    Holder, and derivatives of that collection of files created through
  295
+    textual modification. 
  296
+  - "Standard Version" refers to such a Package if it has not been modified,
  297
+    or has been modified in accordance with the wishes of the Copyright
  298
+    Holder. 
  299
+  - "Copyright Holder" is whoever is named in the copyright or copyrights for
  300
+    the package. 
  301
+  - "You" is you, if you're thinking about copying or distributing this Package.
  302
+  - "Reasonable copying fee" is whatever you can justify on the basis of media
  303
+    cost, duplication charges, time of people involved, and so on. (You will
  304
+    not be required to justify it to the Copyright Holder, but only to the
  305
+    computing community at large as a market that must bear the fee.) 
  306
+  - "Freely Available" means that no fee is charged for the item itself, though
  307
+    there may be fees involved in handling the item. It also means that
  308
+    recipients of the item may redistribute it under the same conditions they
  309
+    received it. 
  310
+
  311
+1. You may make and give away verbatim copies of the source form of the
  312
+Standard Version of this Package without restriction, provided that you
  313
+duplicate all of the original copyright notices and associated disclaimers.
  314
+
  315
+2. You may apply bug fixes, portability fixes and other modifications derived
  316
+from the Public Domain or from the Copyright Holder. A Package modified in such
  317
+a way shall still be considered the Standard Version.
  318
+
  319
+3. You may otherwise modify your copy of this Package in any way, provided that
  320
+you insert a prominent notice in each changed file stating how and when you
  321
+changed that file, and provided that you do at least ONE of the following:
  322
+
  323
+  a) place your modifications in the Public Domain or otherwise make them
  324
+     Freely Available, such as by posting said modifications to Usenet or an
  325
+     equivalent medium, or placing the modifications on a major archive site
  326
+     such as ftp.uu.net, or by allowing the Copyright Holder to include your
  327
+     modifications in the Standard Version of the Package.
  328
+
  329
+  b) use the modified Package only within your corporation or organization.
  330
+
  331
+  c) rename any non-standard executables so the names do not conflict with
  332
+     standard executables, which must also be provided, and provide a separate
  333
+     manual page for each non-standard executable that clearly documents how it
  334
+     differs from the Standard Version.
  335
+
  336
+  d) make other distribution arrangements with the Copyright Holder.
  337
+
  338
+4. You may distribute the programs of this Package in object code or executable
  339
+form, provided that you do at least ONE of the following:
  340
+
  341
+  a) distribute a Standard Version of the executables and library files,
  342
+     together with instructions (in the manual page or equivalent) on where to
  343
+     get the Standard Version.
  344
+
  345
+  b) accompany the distribution with the machine-readable source of the Package
  346
+     with your modifications.
  347
+
  348
+  c) accompany any non-standard executables with their corresponding Standard
  349
+     Version executables, giving the non-standard executables non-standard
  350
+     names, and clearly documenting the differences in manual pages (or
  351
+     equivalent), together with instructions on where to get the Standard
  352
+     Version.
  353
+
  354
+  d) make other distribution arrangements with the Copyright Holder.
  355
+
  356
+5. You may charge a reasonable copying fee for any distribution of this
  357
+Package.  You may charge any fee you choose for support of this Package. You
  358
+may not charge a fee for this Package itself. However, you may distribute this
  359
+Package in aggregate with other (possibly commercial) programs as part of a
  360
+larger (possibly commercial) software distribution provided that you do not
  361
+advertise this Package as a product of your own.
  362
+
  363
+6. The scripts and library files supplied as input to or produced as output
  364
+from the programs of this Package do not automatically fall under the copyright
  365
+of this Package, but belong to whomever generated them, and may be sold
  366
+commercially, and may be aggregated with this Package.
  367
+
  368
+7. C or perl subroutines supplied by you and linked into this Package shall not
  369
+be considered part of this Package.
  370
+
  371
+8. The name of the Copyright Holder may not be used to endorse or promote
  372
+products derived from this software without specific prior written permission.
  373
+
  374
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  375
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  376
+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  377
+
  378
+The End
  379
+
18  Hypatia-0.021/MANIFEST
... ...
@@ -0,0 +1,18 @@
  1
+Changes
  2
+LICENSE
  3
+MANIFEST
  4
+META.yml
  5
+Makefile.PL
  6
+README
  7
+README.md
  8
+dist.ini
  9
+lib/Hypatia.pm
  10
+lib/Hypatia/Base.pm
  11
+lib/Hypatia/Columns.pm
  12
+lib/Hypatia/DBI.pm
  13
+t/columns_native_validation.t
  14
+t/dbi_dbh_table.t
  15
+t/dbi_table.t
  16
+t/load.t
  17
+t/release-pod-syntax.t
  18
+weaver.ini
64  Hypatia-0.021/Makefile.PL
... ...
@@ -0,0 +1,64 @@
  1
+
  2
+use strict;
  3
+use warnings;
  4
+
  5
+
  6
+
  7
+use ExtUtils::MakeMaker 6.30;
  8
+
  9
+
  10
+
  11
+my %WriteMakefileArgs = (
  12
+  "ABSTRACT" => "A Data Visualization API",
  13
+  "AUTHOR" => "Jack Maney <jack\@jackmaney.com>",
  14
+  "BUILD_REQUIRES" => {
  15
+    "Cwd" => 0,
  16
+    "Path::Class" => 0,
  17
+    "Test::More" => 0
  18
+  },
  19
+  "CONFIGURE_REQUIRES" => {
  20
+    "ExtUtils::MakeMaker" => "6.30"
  21
+  },
  22
+  "DISTNAME" => "Hypatia",
  23
+  "EXE_FILES" => [],
  24
+  "LICENSE" => "perl",
  25
+  "NAME" => "Hypatia",
  26
+  "PREREQ_PM" => {
  27
+    "Array::Utils" => 0,
  28
+    "Class::Load" => 0,
  29
+    "DBI" => 0,
  30
+    "Data::Dumper" => 0,
  31
+    "Moose" => 0,
  32
+    "Moose::Util::TypeConstraints" => 0,
  33
+    "Scalar::Util" => 0,
  34
+    "namespace::autoclean" => 0,
  35
+    "strict" => 0,
  36
+    "warnings" => 0
  37
+  },
  38
+  "VERSION" => "0.021",
  39
+  "test" => {
  40
+    "TESTS" => "t/*.t"
  41
+  }
  42
+);
  43
+
  44
+
  45
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
  46
+  my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
  47
+  my $pp = $WriteMakefileArgs{PREREQ_PM};
  48
+  for my $mod ( keys %$br ) {
  49
+    if ( exists $pp->{$mod} ) {
  50
+      $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
  51
+    }
  52
+    else {
  53
+      $pp->{$mod} = $br->{$mod};
  54
+    }
  55
+  }
  56
+}
  57
+
  58
+delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
  59
+  unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
  60
+
  61
+WriteMakefile(%WriteMakefileArgs);
  62
+
  63
+
  64
+
13  Hypatia-0.021/README
... ...
@@ -0,0 +1,13 @@
  1
+
  2
+
  3
+This archive contains the distribution Hypatia,
  4
+version 0.021:
  5
+
  6
+  A Data Visualization API
  7
+
  8
+This software is copyright (c) 2012 by Jack Maney.
  9
+
  10
+This is free software; you can redistribute it and/or modify it under
  11
+the same terms as the Perl 5 programming language system itself.
  12
+
  13
+
45  Hypatia-0.021/README.md
Source Rendered
... ...
@@ -0,0 +1,45 @@
  1
+Hypatia
  2
+=======
  3
+
  4
+Hypatia is a new data visualization API written in Perl.  It takes advantage of several Modern Perl features, including [Moose](https://metacpan.org/module/Moose) and [Dist::Zilla](https://metacpan.org/module/Dist::Zilla) (in fact, as of the time of this writing, the only code committed is for a Dist::Zilla build).
  5
+
  6
+For reporting and analysis of data, it's often useful to have charts and graphs of various kinds:  line graphs, bar charts, histograms, etc.  Of course, CPAN has modules for data visualization--in fact, there are [quite](https://metacpan.org/module/Chart::Clicker) [a](https://metacpan.org/module/GD::Graph) [few](https://metacpan.org/module/GraphViz2) [of](https://metacpan.org/module/Statistics::R) [them](https://metacpan.org/module/Chart::Gnuplot), each with different features and wildly different syntaxes.  The aim of Hypatia is to provide a layer between DBI and these data visualization modules, so that one can get a basic, "no-frills" chart with as little knowledge of the syntax of the particular data visualization package as possible.
  7
+
  8
+So, for example, to get a line graph in [Chart::Clicker](https://metacpan.org/module/Chart::Clicker), one could do this:
  9
+
  10
+<pre>
  11
+use strict;
  12
+use warnings;
  13
+use Hypatia;
  14
+
  15
+my $hypatia=Hypatia->new({
  16
+    back_end=>"Chart::Clicker",
  17
+    graph_type=>"Line",
  18
+    dbi=>{
  19
+	dsn=>"dbi:MySQL:dbname=database;host=localhost",
  20
+	username=>"jdoe",
  21
+	password=>"sooperseekrit",
  22
+	query=>"select DATE(time_of_sale) as date,sum(revenue) as daily_revenue
  23
+	from widget_sales
  24
+	group by DATE(time_of_sale)"
  25
+    },
  26
+    columns=>{"x"=>"date","y"=>"daily_revenue"}
  27
+});
  28
+
  29
+#grabs data from the query and puts it into a Chart::Clicker line graph
  30
+my $cc=$hypatia->chart;
  31
+
  32
+#Since $cc is a Chart::Clicker object, we can now do whatever we want to it.
  33
+
  34
+$cc->title->text("Total Daily Revenue for Widget Sales");
  35
+$cc->write_output("daily_revenue.png");
  36
+
  37
+</pre>
  38
+
  39
+At the moment there is only limited support for part of Chart::Clicker, but this will expand to include support for:
  40
+
  41
+* [GraphViz2](https://metacpan.org/module/GraphViz2)
  42
+* R (via [Statistics::R](https://metacpan.org/release/Statistics-R)).
  43
+* [GD::Graph](https://metacpan.org/module/GD::Graph) (including 3D support with [GD::Graph3D](https://metacpan.org/module/GD::Graph3d)).
  44
+* And many more!
  45
+
14  Hypatia-0.021/dist.ini
... ...
@@ -0,0 +1,14 @@
  1
+name    = Hypatia
  2
+author  = Jack Maney <jack@jackmaney.com>
  3
+license = Perl_5
  4
+copyright_holder = Jack Maney
  5
+copyright_year   = 2012
  6
+version = 0.021
  7
+
  8
+[@Basic]
  9
+[PodWeaver]
  10
+[NextRelease]
  11
+[AutoPrereqs]
  12
+[PodSyntaxTests]
  13
+[PodVersion]
  14
+[PkgVersion]
212  Hypatia-0.021/lib/Hypatia.pm
... ...
@@ -0,0 +1,212 @@
  1
+package Hypatia;
  2
+{
  3
+  $Hypatia::VERSION = '0.021';
  4
+}
  5
+use Moose;
  6
+use Hypatia::Columns;
  7
+use Class::Load qw(load_class);
  8
+use Data::Dumper;
  9
+
  10
+
  11
+#ABSTRACT: A Data Visualization API
  12
+
  13
+
  14
+has 'back_end'=>(isa=>'Str',is=>'ro',required=>1);
  15
+
  16
+
  17
+has 'graph_type'=>(isa=>'Str',is=>'ro',predicate=>'has_graph_type');
  18
+
  19
+sub BUILD
  20
+{
  21
+    my $self=shift;
  22
+    
  23
+    my @allowed_back_ends = qw(Chart::Clicker);
  24
+    
  25
+    my %allowed_graph_types=(q(Chart::Clicker)=>[qw(Area Bar Bubble CandleStick Line Pie Point PolarArea StackedArea StackedBar)]);
  26
+    
  27
+    push @allowed_back_ends,map{"Hypatia::" . $_}@allowed_back_ends;
  28
+    
  29
+    foreach(keys %allowed_graph_types)
  30
+    {
  31
+		$allowed_graph_types{"Hypatia::" . $_} = $allowed_graph_types{$_};
  32
+    }
  33
+    
  34
+    my $back_end=$self->back_end;
  35
+    
  36
+    confess "The back_end value of $back_end is not supported" unless grep{$_ eq $back_end}@allowed_back_ends;
  37
+    
  38
+    $back_end="Hypatia::" . $back_end unless $back_end=~/^Hypatia::/;
  39
+    
  40
+    
  41
+    my $graph_type;
  42
+    my $stacked=0;
  43
+    
  44
+    if($self->has_graph_type)
  45
+    {
  46
+		$graph_type=$self->graph_type;
  47
+		
  48
+		if($graph_type)
  49
+		{
  50
+			confess "The graph_type of $graph_type is not supported with a back_end of $back_end"
  51
+			unless grep{$_ eq $graph_type}@{$allowed_graph_types{$back_end}};
  52
+			
  53
+			if($back_end eq "Hypatia::Chart::Clicker" and $graph_type=~/Stacked/)
  54
+			{
  55
+				$graph_type=~s/Stacked//;
  56
+				$stacked=1;
  57
+			}
  58
+		}
  59
+    }
  60
+    
  61
+    my %args=%{$self->args_to_pass};
  62
+    $args{stacked}=1 if $stacked;
  63
+    
  64
+    my $class=$back_end;
  65
+    $class.="::" . $graph_type if $graph_type;
  66
+    
  67
+    load_class($class);
  68
+    
  69
+    eval{has 'engine'=>(isa=>$class,is=>'rw',handles=>qr/^[^B]|^B(?!UILD)/)};
  70
+    
  71
+    confess $@ if $@;
  72
+    
  73
+    $self->engine($class->new(\%args));
  74
+}
  75
+
  76
+has 'args_to_pass'=>(isa=>'HashRef',is=>'rw',required=>1);
  77
+
  78
+
  79
+
  80
+
  81
+around BUILDARGS =>sub
  82
+{
  83
+    my $orig  = shift;
  84
+    my $class = shift;
  85
+    my $args=shift;
  86
+    
  87
+    confess "Argument passed to BUILDARGS is not a hash reference" unless ref $args eq ref {};
  88
+    
  89
+	confess "No back_end argument given" unless defined $args->{back_end} and (ref $args->{back_end} eq ref "");
  90
+		
  91
+	delete $args->{engine} if defined $args->{engine};
  92
+		
  93
+	$args->{args_to_pass}={};
  94
+		
  95
+	foreach my $attr(keys %$args)
  96
+	{
  97
+		unless($attr eq "back_end" or $attr eq "graph_type")
  98
+		{
  99
+			$args->{args_to_pass}->{$attr}=$args->{$attr};
  100
+			delete $args->{$attr};
  101
+		}
  102
+    }
  103
+    return $class->$orig($args);
  104
+};
  105
+
  106
+
  107
+1;
  108
+
  109
+__END__
  110
+
  111
+=pod
  112
+
  113
+=head1 NAME
  114
+
  115
+Hypatia - A Data Visualization API
  116
+
  117
+=head1 VERSION
  118
+
  119
+version 0.021
  120
+
  121
+=head1 SYNOPSIS
  122
+
  123
+	use strict;
  124
+	use warnings;
  125
+	use Hypatia;
  126
+	
  127
+	my $hypatia=Hypatia->new({
  128
+	back_end=>"Chart::Clicker",
  129
+	graph_type=>"Line",
  130
+	dbi=>{
  131
+		dsn=>"dbi:MySQL:dbname=database;host=localhost",
  132
+		username=>"jdoe",
  133
+		password=>"sooperseekrit",
  134
+		query=>"select DATE(time_of_sale) as date,sum(revenue) as daily_revenue
  135
+		from widget_sales
  136
+		group by DATE(time_of_sale)"
  137
+    },
  138
+  columns=>{"x"=>"date","y"=>"daily_revenue"}
  139
+  });
  140
+  
  141
+  #grabs data from the query and puts it into a Chart::Clicker line graph
  142
+  my $cc=$hypatia->chart;
  143
+  
  144
+  #Since $cc is a Chart::Clicker object, we can now do whatever we want to it.
  145
+  
  146
+  $cc->title->text("Total Daily Revenue for Widget Sales");
  147
+  $cc->write_output("daily_revenue.png");
  148
+
  149
+=head1 DESCRIPTION
  150
+
  151
+For reporting and analysis of data, it's often useful to have charts and graphs of various kinds:  line graphs, bar charts, histograms, etc.  Of course, CPAN has modules for data visualization--in fact, there are L<quite|https://metacpan.org/module/Chart::Clicker> L<a|https://metacpan.org/module/GD::Graph> L<few|https://metacpan.org/module/GraphViz2> L<of|https://metacpan.org/module/Statistics::R> L<them|https://metacpan.org/module/Chart::Gnuplot>, each with different features and wildly different syntaxes.  The aim of Hypatia is to provide a layer between DBI and these data visualization modules, so that one can get a basic, "no-frills" chart with as little knowledge of the syntax of the particular data visualization package as possible.
  152
+
  153
+Currently, only bindings for L<Chart::Clicker> (via L<Hypatia::Chart::Clicker>) is supported.  However, support for other data visualization modules will be supported (see the L</TODO> section below).
  154
+
  155
+=head2 Hypatia?
  156
+
  157
+This distribution makes use of L<DBI>, but isn't an extension of L<DBI>, and hence doesn't belong in the C<DBIx::*> namespace.  It also isn't an extension of, eg, L<Chart::Clicker>, and thus shouldn't be in the C<Chartx::Clicker> namespace (or should that be C<Chart::Clickerx>?  C<Chart::xClicker>?  Bah!).
  158
+
  159
+So, instead, this distribution is named after L<the first female mathematician of historical note and a mathematician and one of the librarians of the Great Library of Alexandria|http://en.wikipedia.org/wiki/Hypatia>
  160
+
  161
+=head2 WARNING
  162
+
  163
+Although I've put a considerable amount of thought into the API, this software should considered to be in alpha status. The API may change, although if it does, I'll do what I can to preserve backwards compatibility.
  164
+
  165
+=head2 TODO
  166
+
  167
+=over 4
  168
+
  169
+=item * Expand the API to other data visualization packages. L<Hypatia::GraphViz2> will be out soon, and other bindings will follow.
  170
+
  171
+=item * Allow the loading of options via configuration files (initially XML or ini; the only thing making this difficult for JSON is that queries usually take more than one line, and JSON doesn't support multi-line strings).
  172
+
  173
+=item * For L<Hypatia::Chart::Clicker>, include an C<Options> object that allows for direct in-lining of C<Chart::Clicker> options (rather than creating them via the C<graph> method and then altering the resulting C<Chart::Clicker> object).
  174
+
  175
+=item * Allow "reasonable" defaults for column names and types. For example, if we have a line graph in L<Chart::Clicker>, and if the C<query> only specifies two columns, then take the first column to be of type C<x> and the second of type C<y>. To do this properly, the query will have to be parsed. Sadly, L<Parse::SQL> doesn't seem to correctly parse queries that contain sub-queries.
  176
+
  177
+=back
  178
+
  179
+=head1 ATTRIBUTES
  180
+
  181
+=head2 back_end
  182
+
  183
+This string attribute represents the general name of the data visualization API that you wish to use.  For right now, the only supported value is C<Chart::Clicker>.
  184
+
  185
+=head2 graph_type
  186
+
  187
+This string attribute represents the type of graph that you want: 
  188
+
  189
+=head1 ACKNOWLEDGEMENTS
  190
+
  191
+I'd like to thank the following people for suggestions in making this distribution better. Any (constructive) criticism and feedback is welcome (jack at jackmaney dot com or jackmaney at gmail dot com).
  192
+
  193
+=over 4
  194
+
  195
+=item 1. L<Cory Watson|http://about.me/cory.g.watson> (aka L<gphat|https://metacpan.org/author/GPHAT>) for suggestions that greatly streamlined the API.
  196
+
  197
+=item 2. L<David Precious|http://www.preshweb.co.uk/> for the idea of passing an active database handle into a L<Hypatia::DBI> object, instead of requiring the connection parameters.
  198
+
  199
+=back
  200
+
  201
+=head1 AUTHOR
  202
+
  203
+Jack Maney <jack@jackmaney.com>
  204
+
  205
+=head1 COPYRIGHT AND LICENSE
  206
+
  207
+This software is copyright (c) 2012 by Jack Maney.
  208
+
  209
+This is free software; you can redistribute it and/or modify it under
  210
+the same terms as the Perl 5 programming language system itself.
  211
+
  212
+=cut
108  Hypatia-0.021/lib/Hypatia/Base.pm
... ...
@@ -0,0 +1,108 @@
  1
+package Hypatia::Base;
  2
+{
  3
+  $Hypatia::Base::VERSION = '0.021';
  4
+}
  5
+use Moose;
  6
+use Hypatia::DBI;
  7
+use Hypatia::Columns;
  8
+use Moose::Util::TypeConstraints;
  9
+use namespace::autoclean;
  10
+
  11
+#ABSTRACT: An Abstract Base Class
  12
+
  13
+
  14
+
  15
+
  16
+coerce "Hypatia::DBI", from "HashRef", via {Hypatia::DBI->new($_)};
  17
+
  18
+
  19
+has 'dbi'=>(isa=>"Hypatia::DBI",is=>'rw',coerce=>1,predicate=>'use_dbi',handles=>['dbh']);
  20
+
  21
+
  22
+subtype 'HypatiaColumns' => as class_type("Hypatia::Columns");
  23
+coerce "HypatiaColumns",from "HashRef", via {Hypatia::Columns->new({columns=>$_})};
  24
+
  25
+#Note: the attribute here is named 'cols' so that we can use the 'columns' handle from the corresponding Hypatia::Columns object.
  26
+#We use BUILDARGS to do the ol' switcheroo.
  27
+has 'cols'=>(isa=>'HypatiaColumns',is=>'ro',coerce=>1,handles=>['columns']);
  28
+
  29
+around BUILDARGS=>sub
  30
+{
  31
+	my $orig  = shift;
  32
+    my $class = shift;
  33
+    my $args=shift;
  34
+	
  35
+	confess "Argument is not a hash reference" unless ref $args eq ref {};
  36
+	
  37
+	$args->{cols}=$args->{columns};
  38
+	delete $args->{columns};
  39
+	
  40
+	return $class->$orig($args);
  41
+};
  42
+
  43
+
  44
+
  45
+
  46
+
  47
+
  48
+1;
  49
+
  50
+__END__
  51
+
  52
+=pod
  53
+
  54
+=head1 NAME
  55
+
  56
+Hypatia::Base - An Abstract Base Class
  57
+
  58
+=head1 VERSION
  59
+
  60
+version 0.021
  61
+
  62
+=head1 ATTRIBUTES
  63
+
  64
+=head2 dbi
  65
+
  66
+If the data source is from DBI, then this attribute contains the information necessary to connect to the database (C<dsn>,C<username>, and C<password>) along with the source of the data within the database (C<query> or C<table>).  This hash reference is passed directly into a L<Hypatia::DBI> object.  Note that if a connection is successful, the resulting database handle is passed into a C<dbh> attribute.  See L<Hypatia::DBI> for more information.
  67
+
  68
+=head2 columns
  69
+
  70
+This is a hash reference whose keys represent the column types (often C<x> and C<y>) and the values of which represent column names from the data that correspond to the given column type.
  71
+
  72
+=head2 input_data
  73
+
  74
+If your data source isn't from a database, then you can store your own data in this attribute.  The requirements will vary depending on subclass.
  75
+
  76
+=head2 columns
  77
+
  78
+This is a hash reference that assigns a sub-class dependent column type (e.g. C<x> or C<y>) to one or more columns.  For example, 
  79
+
  80
+	columns=>{
  81
+		x=>"time_of_day",
  82
+		y=>"num_widget_sales"
  83
+	}
  84
+
  85
+could be used in a line graph to indicate that the "time_of_day" column goes on the x-axis and the "num_widget_sales" column goes on the y-axis.  On the other hand, for a bubble chart, you might have
  86
+
  87
+	columns=>{
  88
+		x=>"total_units_sold",
  89
+		y=>["pct_growth_over_last_year","pct_growth_over_last_month"],
  90
+		size=>["pct_yearly_revenue","pct_monthly_revenue"]
  91
+	}
  92
+
  93
+to indicate a bubble chart with two sets of y values each having two different columns to indicate size, and all with a single set of x values.
  94
+
  95
+B<Note:> The exact requirements of this attribute will vary depending on which sub-class you're calling.  Consult the relevant documentation.
  96
+
  97
+=head1 AUTHOR
  98
+
  99
+Jack Maney <jack@jackmaney.com>
  100
+
  101
+=head1 COPYRIGHT AND LICENSE
  102
+
  103
+This software is copyright (c) 2012 by Jack Maney.
  104
+
  105
+This is free software; you can redistribute it and/or modify it under
  106
+the same terms as the Perl 5 programming language system itself.
  107
+
  108
+=cut
130  Hypatia-0.021/lib/Hypatia/Columns.pm
... ...
@@ -0,0 +1,130 @@
  1
+package Hypatia::Columns;
  2
+{
  3
+  $Hypatia::Columns::VERSION = '0.021';
  4
+}
  5
+use Moose;
  6
+use Array::Utils qw(unique);
  7
+
  8
+#Required column types, defaults to 'x' and 'y'
  9
+has 'column_types'=>(isa=>'ArrayRef[Str]',is=>'ro',default=>sub{[qw(x y)]});
  10
+
  11
+#Actual column values...this hash ref will be filled in from the coercion
  12
+has 'columns'=>(isa=>'HashRef[Str|ArrayRef[Str]]',is=>'ro',required=>1);
  13
+
  14
+#Native validation works as follows:
  15
+#
  16
+# 0. 1 is returned if 'x' isn't a column type or if 'x' is the only column type (and in either case, a warning is thrown).
  17
+# 1.  undef is returned unless all column types other than 'x' are either a) all strings or b) all array references of the same length
  18
+# 2.  If 'x' represents a single column (ie 'x'=>"some_column_name"),
  19
+#     then this is assumed to denote the single, common set of x-values for all values of all other columns.  1 is returned.
  20
+# 3. If 'x' consists of an array reference of columns, then the length of this array reference must be the same as the references of all other column types.
  21
+
  22
+has 'use_native_validation'=>(isa=>'Bool',is=>'ro',default=>1);
  23
+
  24
+sub _validate
  25
+{
  26
+	my $self=shift;
  27
+	
  28
+	my $columns=$self->columns;
  29
+	my $types=$self->column_types;
  30
+	
  31
+	if(grep{$_ eq 'x'}@$types==0)
  32
+	{
  33
+		warn "WARNING: No column_type of 'x' has been found.\n";
  34
+		warn "Native validation in Hypatia::Columns will vacuously succeed.\n";
  35
+		return 1;
  36
+	}
  37
+	elsif(scalar@$types==1)
  38
+	{
  39
+		warn "WARNING: Only one column type--namely '" . $types->[0] . "' detected.\n";
  40
+		warn "Native validation in Hypatia::Columns will vacuously succeed.\n";
  41
+		return 1;
  42
+	}
  43
+	
  44
+	#Looking at reference types of column types other than 'x':
  45
+	my @ref_types_non_x=unique(map{ref $columns->{$_}}grep{$_ ne 'x'}@$types);
  46
+	
  47
+	if(@ref_types_non_x > 1)
  48
+	{
  49
+		warn "Reference non-'x' type mismatch: There are two column types other than 'x' such that one represents a single column and the other represents more than one column.\n";
  50
+		return undef;
  51
+	}
  52
+	
  53
+	
  54
+	if($ref_types_non_x[0] eq ref []) #If the other types correspond to array references
  55
+	{
  56
+		#look at unique lengths of the array references:
  57
+		my @lengths_non_x=unique(map{scalar(@{$columns->{$_}})}grep{$_ ne 'x'}@$types);
  58
+		
  59
+		if(@lengths_non_x > 1)
  60
+		{
  61
+			warn "Number of non-'x' type columns mismatch: All column types other than 'x' must represent the same number of columns.\n";
  62
+			return undef;
  63
+		}
  64
+		elsif(ref $columns->{x} eq ref [] and scalar(@{$columns->{x}}) != $lengths_non_x[0])
  65
+		{
  66
+			warn "Number of 'x' to non-'x' columns mismatch: If type 'x' represents more than one column, then it needs to represent the same number of columns as all other types.\n";
  67
+			return undef;
  68
+		}
  69
+	}
  70
+	
  71
+	return 1;
  72
+	
  73
+}
  74
+
  75
+sub BUILD
  76
+{
  77
+	my $self=shift;
  78
+	my $types=$self->column_types;
  79
+	my $columns=$self->columns;
  80
+	
  81
+	my $num_types=scalar(@$types);
  82
+	
  83
+	unless(scalar(keys %$columns)==$num_types)
  84
+	{
  85
+		confess "Incorrect number of column types (should be $num_types, but I instead got " . scalar(keys %$columns) . ")";
  86
+	}
  87
+	
  88
+	foreach my $col_type(keys %$columns)
  89
+	{
  90
+		unless(grep{$col_type eq $_}@$types)
  91
+		{
  92
+			confess "Column type '$col_type' not found in the column_types attribute (containing " . join(",",map{"'" . $_ . "'"}@$types) . ")";
  93
+		}
  94
+		
  95
+	}
  96
+	
  97
+	if($self->use_native_validation)
  98
+	{
  99
+		confess "Validation failed" unless $self->_validate;
  100
+	}
  101
+}