The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# define a sample DSL extension that will be used in the rest of these test
# This extends Dancer2::Core::DSL but provides an extra keyword
#
# Each test below creates a new package so it can load Dancer2
BEGIN {

    package Dancer2::Test::ExtendedDSL;

    use Moo;
    extends 'Dancer2::Core::DSL';

    sub BUILD {
        my ( $self ) = @_;
        $self->register(foo => 1);
    }

    sub foo {
        return $_[1];
    }
}

package main;

use Test::More tests => 5;

package test1;
use Test::More;

use Dancer2 dsl => 'Dancer2::Test::ExtendedDSL';

ok(defined &foo, 'use line dsl can foo');
is(foo('bar'), 'bar', 'use line Foo returns bar');

package test2;
use Test::More;

ok(!defined &foo, 'intermediate package has no polluted namespace');

package test3;
use Test::More;
use FindBin;
use File::Spec;

BEGIN {
    $ENV{DANCER_CONFDIR} = File::Spec->catdir($FindBin::Bin, 'extend_config');
}

use Dancer2;

ok(defined &foo, 'config specified DSL can foo');
is(foo('baz'), 'baz', 'config specified Foo returns baz');

done_testing;