Downgrade global version - highest version in 9002 on cpan is 1.58 - thus go with...
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Schema / Object.pm
CommitLineData
b6a880d1 1package SQL::Translator::Schema::Object;
2
3# ----------------------------------------------------------------------
478f608d 4# Copyright (C) 2002-2009 SQLFairy Authors
b6a880d1 5#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License as
8# published by the Free Software Foundation; version 2.
9#
10# This program is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13# General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18# 02111-1307 USA
19# -------------------------------------------------------------------
20
21=pod
22
23=head1 NAME
24
25SQL::Translator::Schema::Object - Base class SQL::Translator Schema objects.
26
27=head1 SYNOPSIS
28
29=head1 DESCSIPTION
30
9371be50 31Base class for Schema objects. Sub classes L<Class::Base> and adds the following
32extra functionality.
b6a880d1 33
34=cut
35
36use strict;
37use Class::Base;
9371be50 38use base 'Class::Data::Inheritable';
b6a880d1 39use base 'Class::Base';
7db5f121 40use Class::MakeMethods::Utility::Ref qw( ref_compare );
b6a880d1 41
da06ac74 42use vars qw[ $VERSION ];
43
4ab3763d 44$VERSION = '1.59';
da06ac74 45
46
9371be50 47=head1 Construction
b6a880d1 48
4faaaac6 49Derived classes should declare their attributes using the C<_attributes>
9371be50 50method. They can then inherit the C<init> method from here which will call
51accessors of the same name for any values given in the hash passed to C<new>.
52Note that you will have to impliment the accessors your self and we expect perl
53style methods; call with no args to get and with arg to set.
54
55e.g. If we setup our class as follows;
56
57 package SQL::Translator::Schema::Table;
58 use base qw/SQL::Translator::Schema::Object/;
59
60 __PACKAGE__->_attributes( qw/schema name/ );
61
62 sub name { ... }
63 sub schema { ... }
64
65Then we can construct it with
66
67 my $table = SQL::Translator::Schema::Table->new(
68 schema => $schema,
69 name => 'foo',
70 );
71
72and init will call C<< $table->name("foo") >> and C<< $table->schema($schema) >>
73to set it up. Any undefined args will be ignored.
74
75Multiple calls to C<_attributes> are cumulative and sub classes will inherit
76their parents attribute names.
77
78This is currently experimental, but will hopefull go on to form an introspection
79API for the Schema objects.
80
81=cut
82
83
84__PACKAGE__->mk_classdata("__attributes");
b1789409 85
86# Define any global attributes here
87__PACKAGE__->__attributes([qw/extra/]);
9371be50 88
89# Set the classes attribute names. Multiple calls are cumulative.
90# We need to be careful to create a new ref so that all classes don't end up
91# with the same ref and hence the same attributes!
92sub _attributes {
93 my $class = shift;
94 if (@_) { $class->__attributes( [ @{$class->__attributes}, @_ ] ); }
95 return @{$class->__attributes};
96}
97
98# Call accessors for any args in hashref passed
99sub init {
100 my ( $self, $config ) = @_;
101
102 for my $arg ( $self->_attributes ) {
103 next unless defined $config->{$arg};
104 defined $self->$arg( $config->{$arg} ) or return;
105 }
106
107 return $self;
108}
109
b1789409 110# ----------------------------------------------------------------------
111sub extra {
112
113=pod
114
115=head1 Global Attributes
116
117The following attributes are defined here, therefore all schema objects will
118have them.
119
120=head2 extra
121
122Get or set the objects "extra" attibutes (e.g., "ZEROFILL" for MySQL fields).
24324d76 123Call with no args to get all the extra data.
124Call with a single name arg to get the value of the named extra attribute,
125returned as a scalar. Call with a hash or hashref to set extra attributes.
126Returns a hash or a hashref.
b1789409 127
128 $field->extra( qualifier => 'ZEROFILL' );
24324d76 129
130 $qualifier = $field->extra('qualifier');
131
132 %extra = $field->extra;
133 $extra = $field->extra;
134
b1789409 135=cut
136
137 my $self = shift;
24324d76 138 @_ = %{$_[0]} if ref $_[0] eq "HASH";
139 my $extra = $self->{'extra'} ||= {};
b1789409 140
24324d76 141 if (@_==1) {
142 return exists($extra->{$_[0]}) ? $extra->{$_[0]} : undef ;
b1789409 143 }
24324d76 144 elsif (@_) {
145 my %args = @_;
146 while ( my ( $key, $value ) = each %args ) {
147 $extra->{$key} = $value;
148 }
149 }
150
151 return wantarray ? %$extra : $extra;
b1789409 152}
9371be50 153
a9a72385 154
155# ----------------------------------------------------------------------
156sub equals {
157
158=pod
159
160=head2 equals
161
162Determines if this object is the same as another.
163
164 my $isIdentical = $object1->equals( $object2 );
165
166=cut
167
168 my $self = shift;
169 my $other = shift;
170
171 return 0 unless $other;
57059659 172 return 1 if overload::StrVal($self) eq overload::StrVal($other);
a9a72385 173 return 0 unless $other->isa( __PACKAGE__ );
174 return 1;
175}
176
177# ----------------------------------------------------------------------
7db5f121 178sub _compare_objects {
a9a72385 179 my $self = shift;
7db5f121 180 my $obj1 = shift;
181 my $obj2 = shift;
182 my $result = (ref_compare($obj1, $obj2) == 0);
183# if ( !$result ) {
184# use Carp qw(cluck);
185# cluck("How did I get here?");
186# use Data::Dumper;
187# $Data::Dumper::Maxdepth = 1;
188# print "obj1: ", Dumper($obj1), "\n";
189# print "obj2: ", Dumper($obj2), "\n";
190# }
191 return $result;
a9a72385 192}
193
9371be50 194#=============================================================================
195
1961;
b6a880d1 197
198=pod
199
200=head1 SEE ALSO
201
202=head1 TODO
203
204=head1 BUGS
205
206=head1 AUTHOR
207
208Ken Y. Clark E<lt>kclark@cpan.orgE<gt>, Mark Addison E<lt>mark.addison@itn.co.ukE<gt>
209
210=cut