X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSetManager.pm;h=46aa406bebb3009891cb8a275bd682684df78e2f;hb=f8bad7690ec8115ba42c6fe55a5ddb3a0ad2b8dd;hp=89076a1fe213b66d154a5e918ccc82296c5c3ac3;hpb=570783b1e6693bd3b93f5b57bd5d4cc118f406c9;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSetManager.pm b/lib/DBIx/Class/ResultSetManager.pm index 89076a1..46aa406 100644 --- a/lib/DBIx/Class/ResultSetManager.pm +++ b/lib/DBIx/Class/ResultSetManager.pm @@ -1,51 +1,109 @@ package DBIx::Class::ResultSetManager; use strict; +use warnings; use base 'DBIx::Class'; use Class::Inspector; -__PACKAGE__->mk_classdata($_) for qw/ _attr_cache base_resultset_class custom_resultset_class_suffix /; -__PACKAGE__->_attr_cache({}); +=head1 NAME + +DBIx::Class::ResultSetManager - helpful methods for managing resultset +classes (EXPERIMENTAL) + +=head1 SYNOPSIS + + # in a table class + __PACKAGE__->load_components(qw/ResultSetManager Core/); # note order! + __PACKAGE__->load_resultset_components(qw/AlwaysRS/); + + # will be removed from the table class and inserted into a + # table-specific resultset class + sub search_by_year_desc : ResultSet { + my $self = shift; + my $cond = shift; + my $attrs = shift || {}; + $attrs->{order_by} = 'year DESC'; + $self->search($cond, $attrs); + } + + $rs = $schema->resultset('CD')->search_by_year_desc({ artist => 'Tool' }); + +=head1 DESCRIPTION + +This package implements two useful features for customizing resultset +classes. C loads components in addition to +C (or whatever you set as +C). Any methods tagged with the C +attribute will be moved into a table-specific resultset class (by +default called C, but configurable via +C). Most of the magic is done when you +call C<< __PACKAGE__->table >>. + +=cut + +__PACKAGE__->mk_classdata($_) + for qw/ base_resultset_class table_resultset_class_suffix /; __PACKAGE__->base_resultset_class('DBIx::Class::ResultSet'); -__PACKAGE__->custom_resultset_class_suffix('::_resultset'); +__PACKAGE__->table_resultset_class_suffix('::_resultset'); + +=head2 table + +Stacks on top of the normal L C method. Any +methods tagged with the C attribute will be moved into a +table-specific resultset class (by default called +C, but configurable via +C). The magic for this is done within +this C<< __PACKAGE__->table >> call. + +=cut sub table { my ($self,@rest) = @_; - $self->next::method(@rest); - $self->_register_attributes; - $self->_register_resultset_class; + my $ret = $self->next::method(@rest); + if (@rest) { + $self->_register_attributes; + $self->_register_resultset_class; + } + return $ret; } +=head2 load_resultset_components + + # in a table class + __PACKAGE__->load_components(qw/ResultSetManager Core/); # note order! + __PACKAGE__->load_resultset_components(qw/AlwaysRS/); + +C loads components in addition to +C (or whatever you set as +C). + +=cut + sub load_resultset_components { my ($self,@comp) = @_; my $resultset_class = $self->_setup_resultset_class; $resultset_class->load_components(@comp); } -sub MODIFY_CODE_ATTRIBUTES { - my ($class,$code,@attrs) = @_; - $class->_attr_cache({ %{$class->_attr_cache}, $code => [@attrs] }); - return (); -} - sub _register_attributes { my $self = shift; my $cache = $self->_attr_cache; + return if keys %$cache == 0; + foreach my $meth (@{Class::Inspector->methods($self) || []}) { my $attrs = $cache->{$self->can($meth)}; next unless $attrs; - if ($attrs->[0] eq 'resultset') { + if ($attrs->[0] eq 'ResultSet') { no strict 'refs'; my $resultset_class = $self->_setup_resultset_class; - *{"$resultset_class\::$meth"} = *{"$self\::$meth"}; - undef *{"$self\::$meth"}; + *{"$resultset_class\::$meth"} = $self->can($meth); + delete ${"${self}::"}{$meth}; } } - $self->_attr_cache(undef); } sub _setup_resultset_class { my $self = shift; - my $resultset_class = $self . $self->custom_resultset_class_suffix; + my $resultset_class = $self . $self->table_resultset_class_suffix; no strict 'refs'; unless (@{"$resultset_class\::ISA"}) { @{"$resultset_class\::ISA"} = ($self->base_resultset_class); @@ -55,13 +113,24 @@ sub _setup_resultset_class { sub _register_resultset_class { my $self = shift; - my $resultset_class = $self . $self->custom_resultset_class_suffix; + my $resultset_class = $self . $self->table_resultset_class_suffix; no strict 'refs'; if (@{"$resultset_class\::ISA"}) { - $self->result_source_instance->resultset_class($resultset_class); + $self->result_source_instance->resultset_class($resultset_class); } else { - $self->result_source_instance->resultset_class($self->base_resultset_class); + $self->result_source_instance->resultset_class + ($self->base_resultset_class); } } -1; \ No newline at end of file +1; + +=head1 AUTHORS + +David Kamholz + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut