__PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
_columns _primaries _unique_constraints name resultset_attributes
schema from _relationships column_info_from_storage source_info
- source_name/);
+ source_name sqlt_deploy_callback/);
__PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
result_class/);
=pod
-=head2 new
-
- $class->new();
-
- $class->new({attribute_name => value});
-
-Creates a new ResultSource object. Not normally called directly by end users.
-
=cut
sub new {
$new->{_relationships} = { %{$new->{_relationships}||{}} };
$new->{name} ||= "!!NAME NOT SET!!";
$new->{_columns_info_loaded} ||= 0;
+ $new->{sqlt_deploy_callback} ||= "default_sqlt_deploy_hook";
return $new;
}
=pod
-=head2 source_info
-
-Stores a hashref of per-source metadata. No specific key names
-have yet been standardized, the examples below are purely hypothetical
-and don't actually accomplish anything on their own:
-
- __PACKAGE__->source_info({
- "_tablespace" => 'fast_disk_array_3',
- "_engine" => 'InnoDB',
- });
-
=head2 add_columns
=over
=back
- $table->add_columns(qw/col1 col2 col3/);
+ $source->add_columns(qw/col1 col2 col3/);
- $table->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
+ $source->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
Adds columns to the result source. If supplied key => hashref pairs, uses
the hashref as the column_info for that column. Repeated calls of this
=back
- $table->add_column('col' => \%info?);
+ $source->add_column('col' => \%info?);
Add a single column and optional column info. Uses the same column
info keys as L</add_columns>.
=back
- if ($obj->has_column($colname)) { ... }
+ if ($source->has_column($colname)) { ... }
Returns true if the source has a column of this name, false otherwise.
=back
- my $info = $obj->column_info($col);
+ my $info = $source->column_info($col);
Returns the column metadata hashref for a column, as originally passed
to L</add_columns>. See the description of L</add_columns> for information
return $self->_columns->{$column};
}
-=head2 column_info_from_storage
-
-=over
-
-=item Arguments: 1/0 (default: 0)
-
-=item Return value: 1/0
-
-=back
-
-Enables the on-demand automatic loading of the above column
-metadata from storage as neccesary. This is *deprecated*, and
-should not be used. It will be removed before 1.0.
-
- __PACKAGE__->column_info_from_storage(1);
-
=head2 columns
=over
=cut
sub remove_columns {
- my ($self, @cols) = @_;
-
- return unless $self->_ordered_columns;
+ my ($self, @to_remove) = @_;
- my $columns = $self->_columns;
- my @remaining;
+ my $columns = $self->_columns
+ or return;
- foreach my $col (@{$self->_ordered_columns}) {
- push @remaining, $col unless grep(/$col/, @cols);
- }
-
- foreach (@cols) {
+ my %to_remove;
+ for (@to_remove) {
delete $columns->{$_};
- };
+ ++$to_remove{$_};
+ }
- $self->_ordered_columns(\@remaining);
+ $self->_ordered_columns([ grep { not $to_remove{$_} } @{$self->_ordered_columns} ]);
}
sub remove_column { shift->remove_columns(@_); } # DO NOT CHANGE THIS TO GLOB
return @{ $unique_constraints{$constraint_name} };
}
+=head2 resultset
+
+=over 4
+
+=item Arguments: None
+
+=item Return value: $resultset
+
+=back
+
+Returns a resultset for the given source. This will initially be created
+on demand by calling
+
+ $self->resultset_class->new($self, $self->resultset_attributes)
+
+but is cached from then on unless resultset_class changes.
+
+=head2 resultset_class
+
+=over 4
+
+=item Arguments: $classname
+
+=item Return value: $classname
+
+=back
+
+ package My::ResultSetClass;
+ use base 'DBIx::Class::ResultSet';
+ ...
+
+ $source->resultset_class('My::ResultSet::Class');
+
+Set the class of the resultset, this is useful if you want to create your
+own resultset methods. Create your own class derived from
+L<DBIx::Class::ResultSet>, and set it here. If called with no arguments,
+this method returns the name of the existing resultset class, if one
+exists.
+
+=head2 resultset_attributes
+
+=over 4
+
+=item Arguments: \%attrs
+
+=item Return value: \%attrs
+
+=back
+
+ $source->resultset_attributes({ order_by => [ 'id' ] });
+
+Store a collection of resultset attributes, that will be set on every
+L<DBIx::Class::ResultSet> produced from this result source. For a full
+list see L<DBIx::Class::ResultSet/ATTRIBUTES>.
+
+=cut
+
+sub resultset {
+ my $self = shift;
+ $self->throw_exception(
+ 'resultset does not take any arguments. If you want another resultset, '.
+ 'call it on the schema instead.'
+ ) if scalar @_;
+
+ return $self->resultset_class->new(
+ $self,
+ {
+ %{$self->{resultset_attributes}},
+ %{$self->schema->default_resultset_attributes}
+ },
+ );
+}
+
+=head2 source_name
+
+=over 4
+
+=item Arguments: $source_name
+
+=item Result value: $source_name
+
+=back
+
+Set an alternate name for the result source when it is loaded into a schema.
+This is useful if you want to refer to a result source by a name other than
+its class name.
+
+ package ArchivedBooks;
+ use base qw/DBIx::Class/;
+ __PACKAGE__->table('books_archive');
+ __PACKAGE__->source_name('Books');
+
+ # from your schema...
+ $schema->resultset('Books')->find(1);
+
=head2 from
=over 4
return $found;
}
+=head2 sqlt_deploy_hook
+
+=over 4
+
+=item Arguments: $source, $sqlt_table
+
+=item Return value: undefined
+
+=back
+
+This is NOT a method of C<ResultSource>.
+
+An optional sub which you can declare in your own Result class that will get
+passed the L<SQL::Translator::Schema::Table> object when you deploy the schema
+via L</create_ddl_dir> or L</deploy>.
+
+This is useful to make L<SQL::Translator> create non-unique indexes,
+or set table options such as C<Engine=INNOFB>.
+
+For an example of what you can do with this, see
+L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
+
=head2 resolve_join
=over 4
return $self->schema->class($self->relationship_info($rel)->{source});
}
-=head2 resultset
-
-=over 4
-
-=item Arguments: None
-
-=item Return value: $resultset
-
-=back
-
-Returns a resultset for the given source. This will initially be created
-on demand by calling
-
- $self->resultset_class->new($self, $self->resultset_attributes)
-
-but is cached from then on unless resultset_class changes.
-
-=head2 resultset_class
+=head2 handle
-=over 4
+Obtain a new handle to this source. Returns an instance of a
+L<DBIx::Class::ResultSourceHandle>.
-=item Arguments: $classname
+=cut
-=item Return value: $classname
+sub handle {
+ return new DBIx::Class::ResultSourceHandle({
+ schema => $_[0]->schema,
+ source_moniker => $_[0]->source_name
+ });
+}
-=back
+=head2 throw_exception
- package My::ResultSetClass;
- use base 'DBIx::Class::ResultSet';
- ...
+See L<DBIx::Class::Schema/"throw_exception">.
- $source->resultset_class('My::ResultSet::Class');
+=cut
-Set the class of the resultset, this is useful if you want to create your
-own resultset methods. Create your own class derived from
-L<DBIx::Class::ResultSet>, and set it here. If called with no arguments,
-this method returns the name of the existing resultset class, if one
-exists.
+sub throw_exception {
+ my $self = shift;
+ if (defined $self->schema) {
+ $self->schema->throw_exception(@_);
+ } else {
+ croak(@_);
+ }
+}
-=head2 resultset_attributes
+=head2 source_info
-=over 4
+Stores a hashref of per-source metadata. No specific key names
+have yet been standardized, the examples below are purely hypothetical
+and don't actually accomplish anything on their own:
-=item Arguments: \%attrs
+ __PACKAGE__->source_info({
+ "_tablespace" => 'fast_disk_array_3',
+ "_engine" => 'InnoDB',
+ });
-=item Return value: \%attrs
+=head2 new
-=back
+ $class->new();
- $source->resultset_attributes({ order_by => [ 'id' ] });
+ $class->new({attribute_name => value});
-Store a collection of resultset attributes, that will be set on every
-L<DBIx::Class::ResultSet> produced from this result source. For a full
-list see L<DBIx::Class::ResultSet/ATTRIBUTES>.
+Creates a new ResultSource object. Not normally called directly by end users.
=cut
-sub resultset {
- my $self = shift;
- $self->throw_exception(
- 'resultset does not take any arguments. If you want another resultset, '.
- 'call it on the schema instead.'
- ) if scalar @_;
-
- return $self->resultset_class->new(
- $self,
- {
- %{$self->{resultset_attributes}},
- %{$self->schema->default_resultset_attributes}
- },
- );
-}
-
-=head2 source_name
+=head2 column_info_from_storage
-=over 4
+=over
-=item Arguments: $source_name
+=item Arguments: 1/0 (default: 0)
-=item Result value: $source_name
+=item Return value: 1/0
=back
-Set an alternate name for the result source when it is loaded into a schema.
-This is useful if you want to refer to a result source by a name other than
-its class name.
-
- package ArchivedBooks;
- use base qw/DBIx::Class/;
- __PACKAGE__->table('books_archive');
- __PACKAGE__->source_name('Books');
-
- # from your schema...
- $schema->resultset('Books')->find(1);
-
-=head2 handle
+Enables the on-demand automatic loading of the above column
+metadata from storage as neccesary. This is *deprecated*, and
+should not be used. It will be removed before 1.0.
-Obtain a new handle to this source. Returns an instance of a
-L<DBIx::Class::ResultSourceHandle>.
+ __PACKAGE__->column_info_from_storage(1);
=cut
-sub handle {
- return new DBIx::Class::ResultSourceHandle({
- schema => $_[0]->schema,
- source_moniker => $_[0]->source_name
- });
-}
-
-=head2 throw_exception
+=head2 sqlt_deploy_hook($sqlt_table)
-See L<DBIx::Class::Schema/"throw_exception">.
+Triggers C<sqlt_deploy_callback>.
=cut
-sub throw_exception {
+sub sqlt_deploy_hook {
my $self = shift;
- if (defined $self->schema) {
- $self->schema->throw_exception(@_);
- } else {
- croak(@_);
+ if ( my $hook = $self->sqlt_deploy_callback) {
+ $self->$hook(@_);
}
}
-=head2 sqlt_deploy_hook($sqlt_table)
+=head2 default_sqlt_deploy_hook($table)
-=over 4
+Delegates to a an optional C<sqlt_deploy_hook> method on the C<result_class>.
-=item Arguments: $source, $sqlt_table
+This will get passed the L<SQL::Translator::Schema::Table> object when you
+deploy the schema via L</create_ddl_dir> or L</deploy>.
-=item Return value: undefined
+For an example of what you can do with this, see
+L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
-=back
+=cut
-An optional sub which you can declare in your own Result class that will get
-passed the L<SQL::Translator::Schema::Table> object when you deploy the schema
-via L</create_ddl_dir> or L</deploy>.
+sub default_sqlt_deploy_hook {
+ my $self = shift;
-This is useful to make L<SQL::Translator> create non-unique indexes,
-or set table options such as C<Engine=INNOFB>.
+ my $class = $self->result_class;
-For an example of what you can do with this, see
-L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
+ if ($class and $class->can('sqlt_deploy_hook')) {
+ $class->sqlt_deploy_hook(@_);
+ }
+}
+
+=head2 sqlt_deploy_callback
+
+An attribute which contains the callback to trigger on C<sqlt_deploy_hook>.
+Defaults to C<default_sqlt_deploy_hook>. Can be a code reference or a method
+name.
=head1 AUTHORS