DBIx::Class::Helper::Row::SubClass - Convenient subclassing with DBIx::Class


DBIx-Class-Helpers documentation Contained in the DBIx-Class-Helpers distribution.

Index


Code Index:

NAME

Top

DBIx::Class::Helper::Row::SubClass - Convenient subclassing with DBIx::Class

VERSION

Top

version 2.007000

SYNOPSIS

Top

 # define parent class
 package ParentSchema::Result::Bar;

 use strict;
 use warnings;

 use parent 'DBIx::Class';

 __PACKAGE__->load_components('Core');

 __PACKAGE__->table('Bar');

 __PACKAGE__->add_columns(qw/ id foo_id /);

 __PACKAGE__->set_primary_key('id');

 __PACKAGE__->belongs_to( foo => 'ParentSchema::Result::Foo', 'foo_id' );

 # define subclass
 package MySchema::Result::Bar;

 use strict;
 use warnings;

 use parent 'ParentSchema::Result::Bar';

 __PACKAGE__->load_components(qw{Helper::Row::SubClass Core});

 __PACKAGE__->subclass;

or with DBIx::Class::Candy:

 # define subclass
 package MySchema::Result::Bar;

 use DBIx::Class::Candy
    -base => 'ParentSchema::Result::Bar',
    -components => ['Helper::Row::SubClass'];

 subclass;

DESCRIPTION

Top

This component is to allow simple subclassing of DBIx::Class Result classes.

METHODS

Top

subclass

This is probably the method you want. You call this in your child class and it imports the definitions from the parent into itself.

generate_relationships

This is where the cool stuff happens. This assumes that the namespace is laid out in the recommended MyApp::Schema::Result::Foo format. If the parent has Parent::Schema::Result::Foo related to Parent::Schema::Result::Bar, and you inherit from Parent::Schema::Result::Foo in MyApp::Schema::Result::Foo, you will automatically get the relationship to MyApp::Schema::Result::Bar.

set_table

This is a super basic method that just sets the current classes' table to the parent classes' table.

CANDY EXPORTS

Top

If used in conjunction with DBIx::Class::Candy this component will export:

join_table
subclass
generate_relationships
set_table

NOTE

Top

This Component is mostly aimed at those who want to subclass parts of a schema, maybe for sharing a login system in a few different projects. Do not confuse it with DBIx::Class::DynamicSubclass, which solves an entirely different problem. DBIx::Class::DynamicSubclass is for when you want to store a few very similar classes in the same table (Employee, Person, Boss, etc) whereas this component is merely for reusing an existing schema.

AUTHOR

Top

Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>

COPYRIGHT AND LICENSE

Top


DBIx-Class-Helpers documentation Contained in the DBIx-Class-Helpers distribution.

package DBIx::Class::Helper::Row::SubClass;
BEGIN {
  $DBIx::Class::Helper::Row::SubClass::VERSION = '2.007000';
}

use strict;
use warnings;

# ABSTRACT: Convenient subclassing with DBIx::Class

use DBIx::Class::Helpers::Util qw{get_namespace_parts assert_similar_namespaces};
use DBIx::Class::Candy::Exports;

export_methods [qw(subclass generate_relationships set_table)];

sub subclass {
   my $self = shift;
   my $namespace = shift;
   $self->set_table;
   $self->generate_relationships($namespace);
}

sub generate_relationships {
   my $self = shift;
   my ($namespace) = get_namespace_parts($self);
   foreach my $rel ($self->relationships) {
      my $rel_info = $self->relationship_info($rel);
      my $class = $rel_info->{class};

      assert_similar_namespaces($self, $class);
      my (undef, $result) = get_namespace_parts($class);

      $self->add_relationship(
         $rel,
         "${namespace}::$result",
         $rel_info->{cond},
         $rel_info->{attrs}
      );
   };
}

sub set_table {
   my $self = shift;
   $self->table($self->table);
}

1;


__END__