NAME
    Exporter::Declare - Declarative function exporting

DESCRIPTION
    Declarative function exporting. You can export subs as usual with
    @EXPORT, or export anonymous subs under whatever name you want. You can
    also extend Exporter::Declare very easily. You can also add an export
    from outside the package using the export() class method on it.

    Exporter-Declare also provides a friendly interface to Devel::Declare
    magic. If you want to provide methods that work like MooseX::Declare or
    other Devel::Declare enhanced function, this is the module for you.
    There are a few common recipes available for formatting exports.

EXPORTER SYNOPSIS
  Basic usage (No Devel-Declare)
        package MyPackage;
        use strict;
        use warnings;
        use Exporter::Declare;

        # works as expected
        our @EXPORT = qw/a/;

        # Declare an anonymous export
        export b => sub { 'b' };

        export 'c';
        sub c { 'c' }
        sub a { 'a' }

        1;

  Enhanced Exporting
    Notice, no need for '=> sub', and trailing semicolon is optional.

        package MyPackage;
        use strict;
        use warnings;
        use Exporter::Declare;

        # Declare an anonymous export
        export b { 'b' }

        export c {
            'c'
        }

        export d
        {
            'd'
        }

        1;

  Exporting Devel-Declare magic
        export sl sublike {
            ok( $name, "Got name" );
            $code = pop(@_);
        }

        export cb codeblock {
            $code = pop(@_);
        }

        export mth method {
            $code = pop(@_);
        }

        export beg begin {
            my @args = @_;
        };

        # Inject something into the start of the code block
        export injected method ( inject => 'my $arg2 = shift; ' ) { ... }

        # If you are brave and read up on Recipe's:
        export custom ( recipe => \%myrecipe ) { ... }

    Then to use those in the importing class:

        sl a { ... }

        cb { ... }

        mth {
            ok( $self, "got self" );
            ...
        }

        # Same as BEGIN { beg(@args) };
        beg( @args );

  Extending (Writing your own Exporter-Declare)
        package MyExporterDeclare;
        use strict;
        use warnings;
        use Exporter::Declare ':extend';

        export my_export => sub {
            my ( $name, $sub ) = @_;
            export( $name, $sub );
        };

IMPORTER SYNOPSIS
  Normal
        package MyThing;
        use strict;
        use warnings;
        use MyThingThatExports;

  Import with a prefix
        package MyThing;
        use strict;
        use warnings;
        use MyThingThatExports ':prefix:myprefix';

  Import only some subs
        package MyThing;
        use strict;
        use warnings;
        use MyThingThatExports qw/ sub_a sub_b /;

RECIPES
  Writing custom recipes
    See Exporter::Declare::Recipe

  Provided Recipes
    Exporter::Declare::Recipe::Export
        Used for export()

    Exporter::Declare::Recipe::Sublike
        Things that act like sub name {}

    Exporter::Declare::Recipe::Codeblock
        Things that take a single codeblock as an arg. Like defining sub
        mysub(&) except that you do not need a semicolon at the end.

    Exporter::Declare::Recipe::Method
        Define codeblocks that have $self automatically shifted off.

    Exporter::Declare::Recipe::Begin
        Define a sub that works like 'use' in that it runs at compile time
        (like wrapping it in BEGIN{})

AUTHORS
    Chad Granum exodist7@gmail.com

COPYRIGHT
    Copyright (C) 2010 Chad Granum

    Exporter-Declare is free software; Standard perl licence.

    Exporter-Declare is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for
    more details.

