NAME

Interchange6::Schema::Manual::Cookbook - Miscellaneous recipes

Local schema modifications

We expect Interchange6 developers will feel the need for local changes to the schema that they do not wish to push upstream so here is a quick guide.

Assuming your application is MyApp then we create a package to store the changes in lib/MyApp/Interchange6/Schema.pm:

package MyApp::Interchange6::Schema;

# here in the new package's namespace we use the result classes we want to 
# modify as these must be loaded before we make changes and before
# Interchange6::Schema gets loaded

use Interchange6::Schema::Result::Product;
use Interchange6::Schema::Result::Media;

# now we change our namespace to one we wish to modify

package Interchange6::Schema::Result::Product;

# add a column

__PACKAGE__->add_columns(
    manufacturer_sku => {
        data_type => 'varchar',
        size      => 64,
    },
    wibble => {
        data_type => 'text',
    }
);

# we're going to add a new method to Media

package Interchange6::Schema::Result::Media;

sub foobar {
    my $self = shift;
    return $self->pling($self->buzz);
}

# finally switch back to our schema class and load Interchange6::Schema

package MyApp::Interchange6::Schema;

use base 'Interchange6::Schema';

1;

If you are using Dancer::Plugin::DBIC to set your schema class then instead of the expected config.yml setting:

plugins:
  DBIC:
    default:
      schema_class: Interchange6::Schema

We now use:

plugins:
  DBIC:
    default:
      schema_class: Myapp::Interchange6::Schema

Now your new method is available and you can run <$schema-deploy>> and your new columns will be added.

If you are using DBIx::Class directly then you'll need to be doing something along the lines of:

use MyApp::Interchange::Schema;
my $schema = MyApp::Interchange::Schema->connect;