summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/NonMoose/Meta/Role/Class.pm
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-05-20 16:05:00 -0500
committerJesse Luehrs <doy@tozt.net>2010-05-20 16:05:59 -0500
commit9522bf6fed9c7eb8da5cd6684b609e84964fb0ac (patch)
tree44ca1092fee41881d55cce97e04baac83dc2e131 /lib/MooseX/NonMoose/Meta/Role/Class.pm
parent6c5baf303da194c2388fd5efb2ab7f69767e80a4 (diff)
downloadmoosex-nonmoose-9522bf6fed9c7eb8da5cd6684b609e84964fb0ac.tar.gz
moosex-nonmoose-9522bf6fed9c7eb8da5cd6684b609e84964fb0ac.zip
handle broken constructors that don't like to be subclassed (jhallock)
Diffstat (limited to 'lib/MooseX/NonMoose/Meta/Role/Class.pm')
-rw-r--r--lib/MooseX/NonMoose/Meta/Role/Class.pm16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/MooseX/NonMoose/Meta/Role/Class.pm b/lib/MooseX/NonMoose/Meta/Role/Class.pm
index 5f78326..cc7275e 100644
--- a/lib/MooseX/NonMoose/Meta/Role/Class.pm
+++ b/lib/MooseX/NonMoose/Meta/Role/Class.pm
@@ -142,6 +142,22 @@ sub _check_superclass_constructor {
? $class->FOREIGNBUILDARGS(@_)
: @_;
my $instance = $super_new->execute($class, @foreign_params);
+ if (!blessed($instance)) {
+ confess "The constructor for "
+ . $super_new->associated_metaclass->name
+ . " did not return a blessed instance";
+ }
+ elsif (!$instance->isa($class)) {
+ if (!$class->isa(blessed($instance))) {
+ confess "The constructor for "
+ . $super_new->associated_metaclass->name
+ . " returned an object whose class is not a parent of "
+ . $class;
+ }
+ else {
+ bless $instance, $class;
+ }
+ }
return Class::MOP::Class->initialize($class)->new_object(
__INSTANCE__ => $instance,
%$params,