package SuperClass; sub subclasses { return grep { UNIVERSAL::isa($_,__PACKAGE__) && $_ ne __PACKAGE__ } main::packages(); } package SubClass; @ISA=qw(SuperClass); package main; sub packages { return packages({},\%main::) unless @_; my ($packages,$in) = @_; while(my ($package,$table) = each %$in) { next unless $package =~ /(.*)::$/; next if exists $packages->{$table}; $packages->{$table} = $1; packages($packages,$table); } return values %$packages; } $\=$,="\n"; print SuperClass::subclasses(); #### my @subclasses = grep { /^(.*?)::$/ && # it's a package entry UNIVERSAL::isa($1,__PACKAGE__) # entry is subclass of me! } keys %main:: ; # for everything in main namespace