The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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',
                             minperl => '5.010001' },
        Semantic        => { name => 'Semantic Template wrapper for Dancer',
                             min  => '0.08'                },
        TemplateFlute   => { name => 'Template::Flute wrapper for Dancer'    },
        TemplateSandbox => { name => 'Template::Sandbox'                     },
        Xslate          => { name => 'Text::Xslate wrapper for Dancer'       },
    },

    logging => {
        namespace  => 'Logger',

        ColorConsole => { name => 'A colorful console 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'                   },
        MongoDB   => { name => 'MongoDB session backend for Dancer' },
        PSGI      => { name => 'Plack::Middleware::Session'         },
        Storable  => { name => 'Storable file-based'                },
        CHI       => { name => 'CHI-based session engine',
                       min => 0.001001  },
    },

    plugin => {
        namespace    => 'Plugin',

        Async           => { name => 'write async request handlers with Twiggy' },
        'Auth::Basic'   => { name => 'Basic HTTP authentication',
                             min => 0.011 },
        'Auth::Htpasswd'=> { name => 'Basic HTTP authentication with htpasswd files',
                             min => 0.011 },
        'Auth::RBAC'    => { name => 'Authentication, Security and Role-Based Access Control' },
        'Auth::Twitter' => { name => 'Authenticate with Twitter'                },
        Bcrypt          => { name => 'Bcrypt interface for Dancer'              },
        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'                    },
        DBIC            => { name => 'DBIx::Class interface'       },
        DebugDump       => { name => 'dump objects to debug log'   },
        DebugToolbar    => { name => 'debugging toolbar'           },
        DirectoryView   => { name => 'allow directory browsing'    },
        Dispatcher   	=> { name => 'Controller Class Dispatching for Dancer' },
	ElasticSearch   => { name => 'Allow simple use of ElasticSearch' },
        Email           => { name => 'Email::Stuff integration'    },
        EncodeID        => { name => 'obfuscate IDs in UCLs'       },
        EscapeHTML      => { name => 'Escape HTML entities to avoid XSS vulnerabilities' },
        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'        },
        Hosts           => { name => 'Config trigger for virtual sites' },
        LibraryThing    => { name => 'Plugin for LibraryThing APIs' },
        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'                     },
	Mongoose        => { name => 'MongoDB <-> Moose ORM' 	   },
        MPD             => { name => 'Easy connection to MPD'      },
        Nitesi          => { name => 'Nitesi Shop Machine support' },
        NYTProf         => { name => 'Devel::NYTProf profiling',
                             min => '0.04'                         },
        ORMesque        => { name => 'Light ORM',
                             min => '1.112180'                     },
        Passphrase      => { name => 'Passphrases and Passwords as objects' },
        'Params::Normalization' => { name => 'query param normalization' },
        'Preprocess::Sass' => { name => 'Generate CSS files from Sass/SCSS files'},
        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' }, 0.09 is failing
        Stomp           => { name => 'Interact with Stomp message broker' },
        TimeRequests    => { name => 'Log how long each request took to process' },
        Thumbnail       => { name => 'Easy thumbnail creation',
                             default => 0      },
        ValidationClass => { name => 'Centralized Input Validation' },
        ValidateTiny    => { name => 'Validate::Tiny Dancer plugin' },
        WebSocket       => { name => 'Easily create WebSocket apps' },
        'XML::RSS'      => { name => 'XML::RSS to parse or create RSS feeds' },
    },

    # 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}";

        if (exists($features{$type}{$semi_namespace}{minperl}) &&
            $features{$type}{$semi_namespace}{minperl} > $] ) {
            my $v = $features{$type}{$semi_namespace}{minperl};
            warn "**[ Skipping $full_namespace (requires Perl $v) ]**\n";
            next;
        }

        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;