The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/user/bin/env perl
package Mineral;
use Moose;
use Types::Standard qw( Enum );

has 'type' =>( 
		isa => Enum[qw( Quartz Diamond Basalt Granite )],
		is => 'ro' 
	);

package Identity;
use Moose::Role;

has 'name' =>( is => 'ro' );

use lib '../../../lib';
use MooseX::ShortCut::BuildInstance qw( should_re_use_classes build_instance );
should_re_use_classes( 1 );# To reuse build_instance
use Test::More;
use Test::Moose;

# First build of instance
my 	$paco = build_instance(
		package => 'Pet::Rock',
		superclasses =>['Mineral'],
		roles =>['Identity'],
		type => 'Quartz',
		name => 'Paco',
	);

does_ok( $paco, 'Identity', 'Check that the ' . $paco->meta->name . ' has an -Identity-' );
print'My ' . $paco->meta->name . ' made from -' . $paco->type . '- (a ' .
( join ', ', $paco->meta->superclasses ) . ') is called -' . $paco->name . "-\n";

# Next instance (If you don't want to call build_instance again)
my $Fransisco = Pet::Rock->new(
	type => 'Diamond',
	name => 'Fransisco',
);
does_ok( $Fransisco, 'Identity', 'Check that the ' . $Fransisco->meta->name . ' has an -Identity-' );
print'My ' . $Fransisco->meta->name . ' made from -' . $Fransisco->type . '- (a ' .
( join ', ', $Fransisco->meta->superclasses ) . ') is called -' . $Fransisco->name . "-\n";

# Another instance (reusing build_instance)
my $Gonzalo = build_instance(
		package => 'Pet::Rock',
		superclasses =>['Mineral'],
		roles =>['Identity'],
		type => 'Granite',
		name => 'Gonzalo',
	);
does_ok( $Gonzalo, 'Identity', 'Check that the ' . $Gonzalo->meta->name . ' has an -Identity-' );
print'My ' . $Gonzalo->meta->name . ' made from -' . $Gonzalo->type . '- (a ' .
( join ', ', $Gonzalo->meta->superclasses ) . ') is called -' . $Gonzalo->name . "-\n";
done_testing();