Using Moose Class::MOP , the underlying you can find the subclasses assigned to each class (at this point in time).
From Class::MOP::Class docs:
$ metaclass-> subclasses This returns a list of all subclasses for this class, even indirect subclasses.
$ metaclass-> direct_subclasses This returns a list of immediate subclasses for this class, which does not include indirect subclasses.
So, for example, if we build these classes:
{ package Root; use Moose; use namespace::clean -except => 'meta'; sub baz { say 'Some root thingy' } sub download { say "downloading from " . __PACKAGE__ } } { package NodeA; use Moose; extends 'Root'; use namespace::clean -except => 'meta'; sub download { say "downloading from " . __PACKAGE__ } } { package NodeA1; use Moose; extends 'NodeA'; use namespace::clean -except => 'meta'; sub download { say "downloading from " . __PACKAGE__ } }
Then, using your example as a basis, we can do this:
for my $pname ( Root->new->meta->direct_subclasses ) { my $package = $pname->new; $package->download; }
So the above is done by NodeA->download . When changing above, meta->subclasses will also execute NodeA1->download .
/ I3az /
source share