In Moose, how can I determine if one class of an object is a subclass of another class of the object?

Suppose I have two objects $obj1 and $obj2 , which are instances of Moose classes. I want to know which of the following applies:

  • $obj1 class is the same as $obj2 ';
  • $obj1 class is a subclass of $obj2 's;
  • $obj1 class is a superclass of $obj2 's;
  • None of the object classes is a subclass of the other.

How can i do this?

+4
source share
2 answers
  • Is the class $obj1 the same as $obj2 ?

     ref $obj1 eq ref $obj2; 
  • Is $obj1 class subclass of $obj2 's?

     $obj1->isa(ref $obj2); 
  • Is $obj1 a superclass of $obj2 's class?

     $obj2->isa(ref $obj1); 
  • None of the object classes is a subclass of the other.

    See above.

Update:

In response to comments regarding roles used at runtime:

 package My::X; use Moose; use namespace::autoclean; sub boo { } __PACKAGE__->meta->make_immutable; package My::Y; use Moose; use namespace::autoclean; extends 'My::X'; __PACKAGE__->meta->make_immutable; package My::Z; use Moose::Role; use namespace::autoclean; requires 'boo'; package main; use Test::More tests => 2; use Moose::Util qw( apply_all_roles ); my $x = My::X->new; my $y = My::Y->new; ok($y->isa(ref $x), 'Before role was applied at runtime'); apply_all_roles($x, 'My::Z'); ok($y->isa(ref $x), 'After role was applied at runtime'); 

Output:

  1..2
 ok 1 - Before role was applied at runtime
 not ok 2 - After role was applied at runtime
 # Failed test 'After role was applied at runtime' at C: \ Temp \ t.pl line 36.
 # Looks like you failed 1 test of 2. 
+9
source

Using Class::MOP basics in Moose you can view all this information.

For instance,

 { package Daddy; use Moose; } { package Kid; use Moose; extends 'Daddy'; } my $son = Kid->new; my $daughter = Kid->new; my $sons_class = ($son->meta->class_precedence_list)[0]; my $daughters_class = ($daughter->meta->class_precedence_list)[0]; my @sons_subclasses = $son->meta->subclasses; # or better... my @daughters_subclasses = $daughter->meta->direct_subclasses; my @sons_superclasses = $son->meta->superclasses; my @Daddies_children = Daddy->meta->direct_subclasses; 

Also see this SO question / answer How do I find all packages that inherit from a package in Perl?

/ I3az /

+5
source

All Articles