package Note::Searchable { use Moose::Role; sub search { my $self = shift; my ($search_string) = @_; my $meta = $self->meta; my @results; # Go through all attributes on your object foreach my $attribute ( map { $meta->get_attribute($_) } sort $meta->get_attribute_list ) { # Skip attributes unless they're specifically searchable unless ( $attribute->does('Note::Attribute::Trait::Searchable') ) { next; } my $reader = $attribute->get_read_method(); my $value = $self->$reader; if ( $value =~ m/$search_string/ ) { push( @results, { 'name' => $attribute->name, 'value' => $value } ); } } return @results; } }