Commit | Line | Data |
db4e9221 |
1 | package My::Schema::Result::User; |
2 | |
3 | use strict; |
4 | use warnings; |
de621449 |
5 | use DBIx::Class::ResultClass::HashRefInflator; |
db4e9221 |
6 | use base qw/DBIx::Class::Core/; |
7 | |
8 | ### Define what our admin class is, for ensure_class_loaded() |
9 | my $admin_class = __PACKAGE__ . '::Admin'; |
10 | |
11 | __PACKAGE__->table('users'); |
12 | |
13 | __PACKAGE__->add_columns( |
14 | qw/user_id email password |
15 | firstname lastname active |
16 | admin/ |
17 | ); |
18 | |
19 | __PACKAGE__->set_primary_key('user_id'); |
20 | |
21 | sub inflate_result { |
22 | my $self = shift; |
23 | my $ret = $self->next::method(@_); |
de621449 |
24 | |
db4e9221 |
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; |
28 | } |
29 | return $ret; |
30 | } |
31 | |
32 | sub hello { |
33 | return "I am a regular user."; |
34 | } |
35 | |
36 | package My::Schema::Result::User::Admin; |
37 | |
38 | use strict; |
39 | use warnings; |
40 | use base qw/My::Schema::Result::User/; |
41 | |
42 | # This line is important |
43 | __PACKAGE__->table('users'); |
44 | |
45 | sub hello { |
46 | return "I am an admin."; |
47 | } |
48 | |
49 | sub do_admin_stuff { |
50 | return "I am doing admin stuff"; |
51 | } |
52 | |
53 | package My::Schema; |
54 | |
55 | use base qw/DBIx::Class::Schema/; |
56 | |
57 | My::Schema->register_class( Admin => 'My::Schema::Result::User::Admin' ); |
58 | My::Schema->register_class( User => 'My::Schema::Result::User' ); |
59 | |
60 | 1; |
61 | |
62 | package main; |
63 | |
64 | use lib qw(t/lib); |
65 | use DBICTest; |
de621449 |
66 | use DBIx::Class::ResultClass::HashRefInflator; |
db4e9221 |
67 | |
68 | use Test::More; |
69 | |
70 | my $user_data = { |
71 | email => 'someguy@place.com', |
72 | password => 'pass1', |
73 | admin => 0 |
74 | }; |
75 | |
76 | my $admin_data = { |
77 | email => 'someadmin@adminplace.com', |
78 | password => 'pass2', |
79 | admin => 1 |
80 | }; |
81 | |
82 | ok( my $schema = My::Schema->connection('dbi:SQLite:dbname=:memory:') ); |
83 | |
84 | ok( |
85 | $schema->storage->dbh->do( |
86 | "create table users (user_id, email, password, firstname, lastname, active, admin)" |
87 | ) |
88 | ); |
89 | |
de621449 |
90 | my $rs = $schema->resultset('User'); |
91 | |
db4e9221 |
92 | TODO: { |
93 | local $TODO = 'New objects should also be inflated'; |
de621449 |
94 | my $user = $rs->create($user_data); |
95 | my $admin = $rs->create($admin_data); |
db4e9221 |
96 | |
97 | is( ref $user, 'My::Schema::Result::User' ); |
98 | is( ref $admin, 'My::Schema::Result::User::Admin' ); |
99 | |
100 | } |
101 | |
102 | my $user = $schema->resultset('User')->single($user_data); |
103 | my $admin = $schema->resultset('User')->single($admin_data); |
104 | |
105 | is( ref $user, 'My::Schema::Result::User' ); |
106 | is( ref $admin, 'My::Schema::Result::User::Admin' ); |
107 | |
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.' ); |
112 | |
113 | ok( !$user->can('do_admin_stuff') ); |
114 | ok( $admin->can('do_admin_stuff') ); |
115 | |
116 | done_testing; |