sub mod {
my $set = shift;
- push @{$set->_mods},
- map { $ltm_tc->check($_) ? $_ : $ltm_tc->coerce($_) }
- @_;
+ $ltm_tc->assert_valid($_) for @_;
+
+ push @{$set->_mods}, @_;
$set;
}
sub mods_unique {
my ($set) = @_;
- my (@mods, $has_layer);
+ my (@mods, $last_layer);
MOD:
for my $mod ($set->mods) {
- $has_layer = 1 if $ltml_tc->check($mod);
+ my $is_layer = $ltml_tc->check($mod);
+ $last_layer = $mod if $is_layer;
my $tag = $mod->tag;
my $old = $mods{$tag} || [];
for (@$old) {
next MOD if $_->[0]->cover($mod);
}
- push @{$mods{$tag}}, [ $mod, $last_mod++ ];
+ push @{$mods{$tag}}, [ $mod, $last_mod++, $is_layer ];
push @mods, $mod;
}
- if ($has_layer) {
+ if ($last_layer) {
# Clips and mods don't propagate through layers. Hence if a layer is set,
# force their reuse.
- @mods = map $_->[0], sort { $a->[1] <=> $b->[1] } map @$_, values %mods;
+ @mods = $last_layer;
+ push @mods, map $_->[0],
+ sort { $a->[1] <=> $b->[1] }
+ grep !$_->[2],
+ map @$_,
+ values %mods;
}
return @mods;