use v5.12; use strict; use warnings; package MyClass { use Moo; has _map => ( is => 'lazy', builder => sub { # however you get your list put that here return { 'file1' => { type => 'file' }, 'somedir/file2' => { type => 'file' }, 'dir1' => { type => 'dir' }, 'somedir/dir2' => { type => 'dir' }, 'link1' => { type => 'link', target => 'somedir/file1' }, 'link2' => { type => 'link', target => 'otherdir/file3' }, }; }, ); sub files { my $self = shift; return [ grep { $self->_map->{$_}{type} eq 'file' } keys %{ $self->_map } ]; } sub directories { my $self = shift; return [ grep { $self->_map->{$_}{type} eq 'dir' } keys %{ $self->_map } ]; } sub links { my $self = shift; my @links = grep { $self->_map->{$_}{type} eq 'link' } keys %{ $self->_map }; return [ map { { $_ => $self->_map->{$_}{target} } } @links ]; } }; my $obj = MyClass->new; say for @{ $obj->directories }; #### dir1 somedir/dir2