The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Chloro::Trait::Class;
BEGIN {
  $Chloro::Trait::Class::VERSION = '0.06';
}

use Moose::Role;

use namespace::autoclean;

with 'Chloro::Role::Trait::HasFormComponents';

sub fields {
    my $self = shift;

    return $self->_unique_items('local_fields');
}

sub groups {
    my $self = shift;

    return $self->_unique_items('local_groups');
}

sub _unique_items {
    my $self = shift;
    my $meth = shift;

    my %seen;
    my @items;

    for my $class ( $self->linearized_isa() ) {
        my $meta = Class::MOP::class_of($class);

        next unless $meta && $meta->can($meth);

        for my $item ( $meta->$meth() ) {
            next if $seen{ $item->name() };

            push @items, $item;

            $seen{ $item->name() } = 1;
        }
    }

    return @items;
}

1;