The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Class::DBI::Plugin::Factory - Implementation of "factory pattern"

SYNOPSIS

require this module in your base CDBI class.

MyService::DBI;
use strict;
use base qw/Class::DBI/;
use Class::DBI::Plugin::Factory;

__PACKAGE__->set_db('Main', @datasource);

execute "set_factory" in the class you want to implement "factory pattern".

MyService::Member;
use strict;
use base qw/MyService::DBI/;
__PACKAGE__->table('member');
__PACKAGE__->columns(Primary => qw/member_id/);
__PACKAGE__->columns(Essential => qw/member_type name age/);

__PACKAGE__->set_factory(
    type_column => 'member_type',
    types => {
        -Base    => 'Basic',
        1        => 'Free',
        2        => 'VIP',
    },
);

# abstract method
sub is_free {}
sub monthly_cost {}

define subclasses. for example, MyService::Member::Basic in this case.

package MyService::Member::Basic;
use strict;
use base qw/MyService::Member/;
sub is_free { 0 }
sub monthly_cost { 500 }

define MyService::Member::Free.

package MyService::Member::Free;
use strict;
use base qw/MyService::Member/;
sub is_free { 1 }
sub monthly_cost { 0 }

define MyService::Member::VIP.

package MyService::Member::VIP;
use strict;
use base qw/MyService::Member/;
sub is_free { 0 }
sub monthly_cost { 250 }

after all setting. you can use them like follow.

package main;
use MyService::Member;

my @members = MyService::Member->retrieve_all;

foreach my $member ( @members ) {

    print $member->member_type;

    # if member_type is 1, follow line prints '0'.
    # and if member_type is 2, '250' will be printed.

    print $member->monthly_cost;
}    

DESCRIPTION

This plugin makes CDBI to implement "factory pattern".

set_factory

call this method in a package where you want to design as "factory pattern". and you need to set hashref as a argument of "set_factory". follow 2 keys are required.

type_column

According to a value of the column set with this key, this module rebless records.

types

hashref which defines a relations between type-parameters and subclasses. if undefined type-parameter is found, records will be reblessed to the subclass which defined as '-Base'

SEE ALSO

Class::DBI

AUTHOR

Basic idea and sample by Yasuhiro Horiuchi.

Plugin's code by Lyo Kato <kato@lost-season.jp>

COPYRIGHT AND LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 169:

You forgot a '=back' before '=head1'