NAME
    MooseX::AbstractFactory - AbstractFactory behaviour as a Moose extension

VERSION
    version 0.003003

SYNOPSIS
            package My::Factory;
            use MooseX::AbstractFactory;

            # optional role(s) that define what the implementations should implement

            implementation_does [ qw( My::Factory::Implementation::Requires ) ];
            implementation_class_via sub { 'My::Implementation::' . shift };

            # -------------------------------------------------------------
            package My::Implementation::One;
            use Moose;

            has connection => (is => 'ro', isa => 'Str');

            sub tweak_connection {
                    ...
            }


            # -------------------------------------------------------------
            package My::Factory::Implementation::Requires;
            use Moose::Role;
            requires 'tweak_connection';


            # -------------------------------------------------------------
            package main;
            use My::Factory;

            my $imp = My::Factory->create('One',
                    { connection => 'Type1' },
            );

DESCRIPTION
    Implements an AbstractFactory as a Moose extension

METHODS
  create()
    Returns an instance of the requested implementation.

        use MooseX::AbstractFactory;

            my $imp = My::Factory->create(
                    'Implementation',
                    { connection => 'Type1' },
            );

  implementation_does
    Syntactic sugar to define a list of roles each implementation must
    consume.

  implementation_class_via
    Syntactic sugar to provide a sub to generate the implementation class
    name: e.g.:

        use MooseX::AbstractFactory;
        implementation_class_via sub { 'My::Implementation::' . shift };

    and then

        my $imp = My::Factory->create("ClassA");

        # $imp->isa "My::Implementation::ClassA"

    The default behaviour is to prepend the factory class name, so in the
    above example (without the implementation_class_via) the implementation
    class would be "My::Factory::ClassA".

  init_meta
    Overrides Moose's "init_meta" and applies MooseX::AbstractFactory::Role.

DIAGNOSTICS
    "No implementation provided"
        If the factory class's new() method doesn't get an implementation
        passed, then it will die with the above error.

    "Invalid implementation class %s: %s""
        The implementation passed to the factory class mapped to a class
        that doesn't exist.

BUGS AND LIMITATIONS
    No bugs have been reported. Yet.

    Please report any bugs or feature requests to "mike@altrion.org", or via
    RT.

ACKNOWLEDGMENTS
    Thanks to Dave Rolsky for the suggestions for syntactic sugar.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    https://github.com/fleetfootmike/MX-AbstractFactory/issues

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.

AUTHORS
    *   Mike Whitaker <mike@altrion.org>

    *   Caleb Cushing <xenoterracide@gmail.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2012 by Mike Whitaker.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

