# perldoc > Class::Virtual

---
type: CommandReference
command: Class::Virtual
mode: perldoc
section: 
source: perldoc
---

## Quick Reference

- `Class::Virtual->virtual_methods(@methods)` — declare or retrieve virtual methods
- `__PACKAGE__->missing_methods` — list unimplemented virtual methods
- `__PACKAGE__->virtual_methods` — get list of required virtual methods
- `die __PACKAGE__->missing_methods if @missing` — enforce implementation at compile time

## Name

[Class::Virtual](https://metacpan.org/pod/Class::Virtual) — Base class for virtual base classes (abstract classes).

## Synopsis

perl
package My::Virtual::Idaho;
use base qw(Class::Virtual);

__PACKAGE__->virtual_methods(qw(new foo bar this that));

package My::Private::Idaho;
use base qw(My::Virtual::Idaho);

# Check for missing implementations
my @missing = __PACKAGE__->missing_methods;
die __PACKAGE__ . ' forgot to implement ' . join ', ', @missing if @missing;

# Will halt if new() is not implemented
my $idaho = My::Private::Idaho->new;

# See what methods we're obligated to implement
my @must_implement = __PACKAGE__->virtual_methods;
## Options (Methods)

### `virtual_methods`

- `Class::Virtual->virtual_methods(@virtual_methods)` — declare virtual methods for a base class
- `my @must_implement = Sub::Class->virtual_methods` — retrieve list of declared virtual methods

Sets or reads the list of virtual methods. Once set, they cannot be undone.

### `missing_methods`

- `my @missing_methods = Sub::Class->missing_methods` — returns list of methods that `Sub::Class` has not yet implemented

Intended for use during compile time or regression testing to catch incomplete subclass implementations.

## Examples

From synopsis (see above). Additional usage:

perl
# In a regression test
use Test::More;
use My::Subclass;
my @missing = My::Subclass->missing_methods;
is(@missing, 0, 'all virtual methods implemented');
## Caveats and Bugs

- **Autoloaded methods** are not recognized. No known fix.

## See Also

- [Class::Virtually::Abstract](https://metacpan.org/pod/Class::Virtually::Abstract)