The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use attributes ();

my $x;
{
	package Local::XXX;
	use Sub::Talisman::Struct
		qw( WWW YYY ZZZ ),
		XXX => [qw( $number! )],
	;

	sub foo :XXX(1) { $x };
	sub bar :XXX(2) :YYY :ZZZ { $x };
	sub baz : XXX(3) YYY ZZZ lvalue { $x };
}

my $pkg = 'Local::XXX';

is_deeply(
	[ Sub::Talisman->get_attributes($pkg->can('foo')) ],
	[ map {"$pkg\::$_"} qw(XXX) ],
	'correct talismans for foo',
);

is_deeply(
	[ Sub::Talisman->get_attributes($pkg->can('bar')) ],
	[ map {"$pkg\::$_"} qw(XXX YYY ZZZ) ],
	'correct talismans for bar',
);

is_deeply(
	[ Sub::Talisman->get_attributes($pkg->can('baz')) ],
	[ map {"$pkg\::$_"} qw(XXX YYY ZZZ) ],
	'correct talismans for baz',
);

is_deeply(
	[ sort my @x = attributes::get($pkg->can('baz')) ],
	[ qw( XXX YYY ZZZ lvalue ) ],
	'correct attributes for baz',
);

is_deeply(
	[ sort Sub::Talisman->get_subs("$pkg\::XXX") ],
	[ map {"$pkg\::$_"} qw( bar baz foo ) ],
	'correct subs for :XXX',
);

is_deeply(
	[ sort Sub::Talisman->get_subs("$pkg\::YYY") ],
	[ map {"$pkg\::$_"} qw( bar baz ) ],
	'correct subs for :YYY',
);

is_deeply(
	[ sort Sub::Talisman->get_subs("$pkg\::ZZZ") ],
	[ map {"$pkg\::$_"} qw( bar baz ) ],
	'correct subs for :ZZZ',
);

is_deeply(
	+{ %{Sub::Talisman->get_attribute_parameters($pkg->can('foo'), "$pkg\::XXX")} },
	+{ number => 1 },
	'correct parameters for foo :XXX',
);

is_deeply(
	+{ %{Sub::Talisman->get_attribute_parameters($pkg->can('bar'), "$pkg\::XXX")} },
	+{ number => 2 },
	'correct parameters for bar :XXX',
);

is_deeply(
	+{ %{Sub::Talisman->get_attribute_parameters($pkg->can('baz'), "$pkg\::XXX")} },
	+{ number => 3 },
	'correct parameters for baz :XXX',
);

ok(
	!$pkg->can('XXX'),
	'sub XXX was cleaned'
);

ok(
	!$pkg->can('YYY'),
	'sub YYY was cleaned'
);

ok(
	!$pkg->can('ZZZ'),
	'sub ZZZ was cleaned'
);

done_testing;