DBIx::Class::DynamicSubclass is a Perl module that offers a convenient way to use dynamic subclassing.
SYNOPSIS
package My::Schema::Game;
__PACKAGE__->load_components(qw/DynamicSubclass Core/);
__PACKAGE__->add_column(qw/id name data type/);
__PACKAGE__->typecast_map(type => {
1 => 'My::Schema::Game::Online',
2 => 'My::Schema::Game::Shareware',
3 => 'My::Schema::Game::PDA',
});
$game = $schema->resultset('Game')->new({..., type => 1});
# ref $game = 'My::Schema::Game::Online'
@games = $game->search({type => 2});
# @games are all of class My::Schema::Game::Shareware
$game->type(3); # game is now of class My::Schema::Game::PDA
$game = $schema->resultset('Game')->new({});
# or
$game->type(undef);
# game is now of type My::Schema::Game
#Dynamic properties with DBIx::Class::FrozenColumns
package My::Schema::Game;
__PACKAGE__->load_components(qw/... FrozenColumns .../);
package My::Schema::Game::Online;
use base 'My::Schema::Game';
__PACKAGE__->add_frozen_columns(data => qw/flash server_host server_port/);
package My::Schema::Game::Shareware;
use base 'My::Schema::Game';
__PACKAGE__->add_frozen_columns(data => qw/price download_url/);
...
$game->type(1); #game would have now additional columns 'flash', 'server_host', etc.
$game->server_host('...'); #(stored in 'data')
$game->type(2);
$game->server_host; #error
$game->price('$3.00'); #ok
$game = $rs->new({
type => 1,
flash => 'game.swf',
}); #ok
#More flexible way
package My::Schema::Game;
__PACKAGE__->typecast_column('type');
sub classify { #called each time the object gets or losses its 'type'
my $self = shift;
#decide which class do you want
bless $self, $class;
}
Product's homepage
Requirements:
· Perl