/usr/local/CPAN/Task-Dancer/Makefile.PL


use strict;
use warnings;

# Load the Module::Install bundled in ./inc/
use inc::Module::Install;

my %features = (
    templating => {
        namespace       => 'Template',

        Tiny            => { name => 'Template::Tiny',
                             min  => '0.02'                },
        HtmlTemplate    => { name => 'HTML::Template',
                             min  => '0.02'                },

        Alloy           => { name => 'Alloy'               },
        Tenjin          => { name => 'Tenjin'              },
        Haml            => { name => 'Text::HAML'          },
        Mason           => { name => 'HTML::Mason'         },
        Mason2          => { name => 'HTML::Mason2',
                             min  => '0.02'                },
        MicroTemplate   => { name => 'Text::MicroTemplate' },
        MojoTemplate    => { name => 'Mojo::Template wrapper for Dancer'     },
        Semantic        => { name => 'Semantic Template wrapper for Dancer'  },
        TemplateSandbox => { name => 'Template::Sandbox'   },
        Xslate          => { name => 'Text::Xslate wrapper for Dancer'       },
    },

    logging => {
        namespace  => 'Logger',

        LogHandler => { name => 'Log::Handler'                               },
        Log4perl   => { name => 'Log4Perl'                                   },
        Pipe       => { name => 'Pipe-based logging engine for Dancer'       },
        PSGI       => { name => 'PSGI'                                       },
        Spinner    => { name => 'Show a spinner in the console log messages' },
        Syslog     => { name => 'Sys::Syslog'                                },
    },

    serialization => {
        namespace => 'Serializer',

        UUEncode => { name => 'UU Encoding serializer' },
    },

    session => {
        namespace => 'Session',

        Cookie    => { name => 'Encrypted cookie-based'          },
        KiokuDB   => { name => 'KiokuDB Dancer session backend',
                       min  => '0.04'                            },
        Memcached => { name => 'Cache::Memcached'                },
        PSGI      => { name => 'Plack::Middleware::Session'      },
        Storable  => { name => 'Storable file-based'             },
    },

    plugin => {
        namespace    => 'Plugin',

        Async           => { name => 'write async request handlers with Twiggy' },
        'Auth::RBAC'    => { name => 'Authentication, Security and Role-Based Access Control' },
        'Auth::Twitter' => { name => 'Authenticate with Twitter' },
        Browser         => { name => 'Browser detection'         },
        'Cache::CHI'    => { name => 'Plugin to cache response content' },
        'Captcha::SecurityImage' => {
                             name    => 'Generate and verify GD::SecurityImage captchas',
                             default => 0                          },
        Database        => { name => 'Database'                    },
        DataFu          => { name => 'Generate HTML tables/forms'  },
        DBIC            => { name => 'DBIx::Class interface'       },
        DebugDump       => { name => 'dump objects to debug log'   },
        Email           => { name => 'Email::Stuff integration'    },
        Facebook        => { name => 'Plugin linking Dancer with Facebook::Graph' },
        'Fake::Response' => { name => 'Fake request for inremental implementations' },
        Feed            => { name => 'Generate feed rss or atom'   },
        FlashMessage    => { name => 'Display temporary messages'  },
        FlashNote       => { name => 'Notification messages'       },
        FormattedOutput => { name => 'Provide output in a variety of formats' },
        FormValidator   => { name => 'Easy input validator'        },
        # GearmanXS     => { name => 'a Dancer Gearman::XS client' }, => failing 0.110570
        Memcached       => { name => 'Cache response content'      },
        MemcachedFast   => { name => 'Cache things using Cache::Memcached::Fast' },
        MobileDevice    => { name => 'Dancer app mobile-aware',
                             min  => '0.03'                        },
        # Mongo           => { name => 'MongoDB'                     },
        MPD             => { name => 'Easy connection to MPD'      },
        # ORMesque      => { name => 'Light ORM'                   }, => failing 1.103180
        'Params::Normalization' => { name => 'query param normalization' },
        Progress        => { name => 'display a progress bar during long-running requests' },
        ProxyPath       => { name => 'Provides user-perspective paths' },
        Redis           => { name => 'Redis database connections'  },
        REST            => { name => 'RESTful apps',
                             min  => '0.05'                        },
        # Scoped        => { name => 'parameter variables scoping' }, => failing 0.01
        SimpleCRUD      => { name => 'very simple CRUD',
                             min  => '0.02'                        },
        SiteMap         => { name => 'Site map creation'           },
        SMS             => { name => 'Easy SMS sending'            },
        SporeDefinitionControl => { name => 'Validite route from a Spore' },
        TimeRequests    => { name => 'Log how long each request took to process' },
        # Validation    => { name => 'Oogly Data validation'       }, => not available on CPAN?
        ValidationClass => { name => 'Centralized Input Validation' },
        WebSocket       => { name => 'Easily create WebSocket apps' },
    },

    # for now it's middlewares
    middleware => {
        namespace => 'Middleware',
        Rebase    => { name => 'Plack middleware for Dancer' },
    },

    other => {
        Debug => { name => 'Plack::Middleware::Debug' },
    },
);

name     'Task-Dancer';
all_from 'lib/Task/Dancer.pm';
license  'perl';
include  'Module::AutoInstall';
requires 'Dancer' => 0;

foreach my $type ( keys %features ) {
    my $namespace = delete $features{$type}{'namespace'};

    foreach my $semi_namespace ( keys %{ $features{$type} } ) {
        my $full_namespace = $namespace                               ?
                            "Dancer::${namespace}::${semi_namespace}" :
                            "Dancer::${semi_namespace}";

        my ( $name, $default, $min ) =
            @{ $features{$type}{$semi_namespace} }{qw/ name default min /};

        # install by default unless otherwise specified
        $default = defined($default) ? 0 : 1;
        # no minimum version by default
        $min ||= 0;

        feature "$name $type support",
            -default => $default, $full_namespace => $min;
    }
}

auto_install;
WriteAll;