use strict; use warnings; use Test::More; use Test::Fatal; use Moose(); { my $exception = exception { my $method = Moose::Meta::Method::Destructor->new( options => (1,2,3)); }; like( $exception, qr/You must pass a hash of options/, "options is not a HASH ref"); isa_ok( $exception, "Moose::Exception::MustPassAHashOfOptions", "options is not a HASH ref"); } { my $exception = exception { my $method = Moose::Meta::Method::Destructor->new( options => {}); }; like( $exception, qr/You must supply the package_name and name parameters/, "package_name and name are not given"); isa_ok( $exception, "Moose::Exception::MustSupplyPackageNameAndName", "package_name and name are not given"); } { my $exception = exception { my $method = Moose::Meta::Method::Destructor->is_needed("foo"); }; like( $exception, qr/The is_needed method expected a metaclass object as its arugment/, "'foo' is not a metaclass"); isa_ok( $exception, "Moose::Exception::MethodExpectedAMetaclassObject", "'foo' is not a metaclass"); is( $exception->metaclass, 'foo', "'foo' is not a metaclass"); } { { package TestClass; use Moose; } { package SubClassDestructor; use Moose; extends 'Moose::Meta::Method::Destructor'; sub _generate_DEMOLISHALL { return "print 'xyz"; # this is an intentional syntax error } } my $methodDestructor; my $exception = exception { $methodDestructor = SubClassDestructor->new( name => "xyz", package_name => "Xyz", options => {}, metaclass => TestClass->meta); }; like( $exception, qr/Could not eval the destructor/, "syntax error in the return value of _generate_DEMOLISHALL"); isa_ok( $exception, "Moose::Exception::CouldNotEvalDestructor", "syntax error in the return value of _generate_DEMOLISHALL"); } done_testing;