1 package My::Schema::Result::User;
5 use DBIx::Class::ResultClass::HashRefInflator;
6 use base qw/DBIx::Class::Core/;
8 ### Define what our admin class is, for ensure_class_loaded()
9 my $admin_class = __PACKAGE__ . '::Admin';
11 __PACKAGE__->table('users');
13 __PACKAGE__->add_columns(
14 qw/user_id email password
15 firstname lastname active
19 __PACKAGE__->set_primary_key('user_id');
23 my $ret = $self->next::method(@_);
25 if ( $ret->admin ) { ### If this is an admin, rebless for extra functions
26 $self->ensure_class_loaded($admin_class);
27 bless $ret, $admin_class;
33 return "I am a regular user.";
36 package My::Schema::Result::User::Admin;
40 use base qw/My::Schema::Result::User/;
42 # This line is important
43 __PACKAGE__->table('users');
46 return "I am an admin.";
50 return "I am doing admin stuff";
55 use base qw/DBIx::Class::Schema/;
57 My::Schema->register_class( Admin => 'My::Schema::Result::User::Admin' );
58 My::Schema->register_class( User => 'My::Schema::Result::User' );
66 use DBIx::Class::ResultClass::HashRefInflator;
71 email => 'someguy@place.com',
77 email => 'someadmin@adminplace.com',
82 ok( my $schema = My::Schema->connection('dbi:SQLite:dbname=:memory:') );
85 $schema->storage->dbh->do(
86 "create table users (user_id, email, password, firstname, lastname, active, admin)"
90 my $rs = $schema->resultset('User');
93 local $TODO = 'New objects should also be inflated';
94 my $user = $rs->create($user_data);
95 my $admin = $rs->create($admin_data);
97 is( ref $user, 'My::Schema::Result::User' );
98 is( ref $admin, 'My::Schema::Result::User::Admin' );
102 my $user = $schema->resultset('User')->single($user_data);
103 my $admin = $schema->resultset('User')->single($admin_data);
105 is( ref $user, 'My::Schema::Result::User' );
106 is( ref $admin, 'My::Schema::Result::User::Admin' );
108 is( $user->password, 'pass1' );
109 is( $admin->password, 'pass2' );
110 is( $user->hello, 'I am a regular user.' );
111 is( $admin->hello, 'I am an admin.' );
113 ok( !$user->can('do_admin_stuff') );
114 ok( $admin->can('do_admin_stuff') );