Eporter::Easy gets rid of the drudgery of exporting symbols allowing you to
eliminate those bits of code that exists in every single module that uses
Exporter.

It also allows you to define tags in terms of other tags  and you no longer
have to worry about filling in @EXPORT_OK.

So

require Exporter;
our @ISA = ('Exporter');
our @EXPORT = qw( open close );

becomes

use Exporter::Easy(EXPORT => [qw( open close ]);

and

use strict;

our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS, @VARS, @);
require Exporter;
our @ISA = ('Exporter');
@EXPORT      = qw(getservbyname getservbyport getservent getserv);
@EXPORT_OK   = qw( $s_name @s_aliases $s_port $s_proto );
%EXPORT_TAGS = (FIELDS => [ @EXPORT_OK, @EXPORT ] );

our ($s_name, @s_aliases, $s_port, $sx_proto);

$s_port = 8080;

becomes

use strict;

use Exporter::Easy(
	EXPORT => [qw(getservbyname getservbyport getservent getserv)],
	OK => [qw( $s_name @s_aliases $s_port $s_proto ]),
	ALL => 'FIELDS',
);

$s_port = 8080;

and finally this becomes possible without lots of nasty arrays

use Exporter::Easy (
	EXPORT => [qw( init :base )],
	TAGS => [
		base => [qw( open close )],
		read => [qw( read sysread readline )],
		write => [qw( print write writeline )],
		misc => [qw( select flush )],
		most => [qw( :base :read :write)],
		no_misc => [qw( :all !:misc )],
	],
	OK => [qw( $some $other $stuff )],
	ALL => 'all',
);

Exporter::Easiest lets you do leave out almost all of the punctuation, so
the above becomes

use Exporter::Easy q(

	:base => open close
	:read => read sysread readline
	:write => print write writeline
	:misc => select flush
	:most => :base :read :write
	:no_misc => :all !:misc

	EXPORT => init :base
	OK => $some $other $stuff
	ALL => all
);



 epxorting symbols can't get
any easier than this!

Written by Fergal Daly <fergal@esatclear.ie>
