#!/usr/bin/perl -w use strict; package Bar; use base 'IO::Handle'; package Element; sub new { my $type = shift; my $self = {}; bless $self, $type; } package Circle; use vars qw(@ISA); @ISA = qw( Element ); package Square; use vars qw(@ISA); @ISA = qw( Element ); package Line; use vars qw(@ISA); @ISA = qw( Element ); package main; sub list_of_derived_classes { my $class = shift; my @pkg_keys; { no strict 'refs'; @pkg_keys = grep { /::$/ } keys %{__PACKAGE__.'::'}; } my @result; for (@pkg_keys) { no strict 'refs'; if (defined ${$_}{ISA}) { push @result, $_ if grep {/^$class$/} @{${$_}{ISA}}; } } s/::$// for @result; @result; } for my $class (qw(Element IO::Handle)) { print "$class\: ",join(', ', list_of_derived_classes($class)),$/; } __END__ Element: Circle, Line, Square IO::Handle: Bar