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>