The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

use Test::More;

use lib qw(t/lib);
use DBICTest;

package My::Schema::Result::User;

use strict;
use warnings;
use base qw/DBIx::Class::Core/;

### Define what our admin class is, for ensure_class_loaded()
my $admin_class = __PACKAGE__ . '::Admin';

__PACKAGE__->table('users');

__PACKAGE__->add_columns(
    qw/user_id   email    password
      firstname lastname active
      admin/
);

__PACKAGE__->set_primary_key('user_id');

sub inflate_result {
    my $self = shift;
    my $ret  = $self->next::method(@_);
    if ( $ret->admin ) {    ### If this is an admin, rebless for extra functions
        $self->ensure_class_loaded($admin_class);
        bless $ret, $admin_class;
    }
    return $ret;
}

sub hello {
    return "I am a regular user.";
}

package My::Schema::Result::User::Admin;

use strict;
use warnings;
use base qw/My::Schema::Result::User/;

# This line is important
__PACKAGE__->table('users');

sub hello {
    return "I am an admin.";
}

sub do_admin_stuff {
    return "I am doing admin stuff";
}

package My::Schema;

use base qw/DBIx::Class::Schema/;

My::Schema->register_class( Admin => 'My::Schema::Result::User::Admin' );
My::Schema->register_class( User  => 'My::Schema::Result::User' );

1;

package main;
my $user_data = {
    email    => 'someguy@place.com',
    password => 'pass1',
    admin    => 0
};

my $admin_data = {
    email    => 'someadmin@adminplace.com',
    password => 'pass2',
    admin    => 1
};

ok( my $schema = My::Schema->connect(DBICTest->_database) );

ok(
    $schema->storage->dbh->do(
"create table users (user_id, email, password, firstname, lastname, active,  admin)"
    )
);

{
  my $user  = $schema->resultset('User')->create($user_data);
  my $admin = $schema->resultset('User')->create($admin_data);

  is( ref $user,  'My::Schema::Result::User' );

  local $TODO = 'New objects should also be inflated';
  is( ref $admin, 'My::Schema::Result::User::Admin' );
}

my $user  = $schema->resultset('User')->single($user_data);
my $admin = $schema->resultset('User')->single($admin_data);

is( ref $user,  'My::Schema::Result::User' );
is( ref $admin, 'My::Schema::Result::User::Admin' );

is( $user->password,  'pass1' );
is( $admin->password, 'pass2' );
is( $user->hello,     'I am a regular user.' );
is( $admin->hello,    'I am an admin.' );

ok( !$user->can('do_admin_stuff') );
ok( $admin->can('do_admin_stuff') );

done_testing;