# perldoc > Exporter::Tiny::Manual::Exporting

---
type: CommandReference
command: Exporter::Tiny::Manual::Exporting
mode: perldoc
section: ""
source: perldoc
---

## Quick Reference

- `use Exporter::Shiny qw(foo bar)` — simple export list using `@EXPORT`, `@EXPORT_OK`, `%EXPORT_TAGS`
- `our %EXPORT_TAGS = (rgb => [qw(red green blue)])` — define tags that reference other tags with `:tag`
- `sub _generate_foo { ... }` — generate exported sub dynamically
- `sub _generateScalar_Foo { ... }` — generate non-code symbol `$Foo`
- `sub _exporter_validate_opts { ... }` — hook to validate global options before export
- `sub _exporter_expand_tag { ... }` — override tag expansion logic
- `sub _exporter_install_sub { ... }` — override sub installation (renaming, prefix, suffix)
- `sub _exporter_fail { ... }` — customize failure handling when export target not found

## Name

Exporter::Tiny::Manual::Exporting - creating an exporter using Exporter::Tiny

## Synopsis

Read [Exporter::Tiny::Manual::QuickStart](https://www.chedong.com/phpMan.php/perldoc/Exporter%3A%3ATiny%3A%3AManual%3A%3AQuickStart/markdown) first.

## Options (Methods)

### Advanced Tag Stuff

- `%EXPORT_TAGS` — define tags as lists of symbol names or other tags (e.g. `:rgb`)
- Tag expansion loops cause infinite loops; avoid cycles.

### Generators

- `_generate_foo` — class method to generate a sub `foo` for export
- `_generateScalar_Foo`, `_generateArray_Bar`, `_generateHash_Baz` — generate non-code symbols
- Generator receives `($class, $name, $args, $globals)` where `$globals->{into}` is the target package
- Tags can also be generated by setting `$EXPORT_TAGS{constants} = sub { ... }` returning a list of names

### Hooks

- `_exporter_validate_opts($globals)` — called before export; often used to read `$globals->{into}`
- `_exporter_validate_unimport_opts($globals)` — same for unimport

### Overriding Internals

All internal functions are class methods; override them in your subclass.

- `_exporter_validate_opts($globals)` — validate global options
- `_exporter_validate_unimport_opts($globals)` — validate unimport options
- `_exporter_merge_opts($tag_opts, $globals, @exports)` — merge tag options into export options
- `_exporter_expand_tag($name, $args, $globals)` — expand `:tag` into list of `[$name, $args]` pairs
- `_exporter_expand_regexp($regexp, $args, $globals)` — expand regexp-like string to list of exports
- `_exporter_expand_sub($name, $args, $globals)` — translate sub name to hash of `name => coderef`; default checks `_exporter_permitted_regexp` and calls generator or `can`
- `_exporter_permitted_regexp($globals)` — returns regexp for valid export names (from `@EXPORT` and `@EXPORT_OK`)
- `_exporter_fail($name, $args, $globals)` — called when coderef not found; default throws exception, override to return hash of names/coderefs
- `_exporter_install_sub($name, $args, $globals, $coderef)` — installs sub into target; default handles renaming, prefix, suffix
- `_exporter_uninstall_sub($name, $args, $globals)` — removes sub from target

## Examples

### Generator for a sub

perl
push @EXPORT_OK, 'foo';

sub _generate_foo {
    my $class = shift;
    my ($name, $args, $globals) = @_;
    return sub { ... };
}
### Tag with generator

perl
my %constants;
BEGIN {
    %constants = (FOO => 1, BAR => 2);
}
use constant \%constants;

$EXPORT_TAGS{constants} = sub {
    my $class = shift;
    my ($name, $args, $globals) = @_;
    return keys(%constants);
};
## See Also

- [Exporter::Shiny](https://www.chedong.com/phpMan.php/perldoc/Exporter%3A%3AShiny/markdown)
- [Exporter::Tiny](https://www.chedong.com/phpMan.php/perldoc/Exporter%3A%3ATiny/markdown)

## Exit Codes

Not documented.