---
name: "Sub::HandlesVia::Manual::WithMoo"
section: "3pm"
platform: "linux"
package: "perl-sub-handlesvia"
version: "0.053005-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Sub::HandlesVia::Manual::WithMoo"
---

# Sub::HandlesVia::Manual::WithMoo(3pm)

using Sub::HandlesVia with Moo

## NAME

Sub::HandlesVia::Manual::WithMoo - using Sub::HandlesVia with Moo

## SYNOPSIS

```
 package Kitchen {
   use Moo;
   use Sub::HandlesVia;
   use Types::Standard qw( ArrayRef Str );

   has food => (
     is          => 'ro',
     isa         => ArrayRef[Str],
     handles_via => 'Array',
     default     => sub { [] },
     handles     => {
       'add_food'    => 'push',
       'find_food'   => 'grep',
     },
   );
 }
```

## MANUAL

Sub::HandlesVia allows you to delegate methods from your class to the values of your objects' attributes.

Conceptually, it allows you to define `"$object->push_number($n)"` to be a shortcut for `"$object->numbers->push($n)"` except that `"$object->numbers"` is an arrayref, so doesn't have methods you can call on it like `"push"`.

You should be able to use Sub::HandlesVia as a drop-in replacement for MooX::HandlesVia, which provides a similar feature, though has a more limited implementation. Sub::HandlesVia honours type constraints, plus it can mutate non-reference values.

### Which Methods Can Be Delegated To?

The `"handles_via"` option indicates which library of methods should be available. Valid values include Array, Blessed, Bool, Code, Counter, Enum, Hash, Number, Scalar, and String.

An arrayref can be provided for `"handles_via"`, though many of the options are conceptually contradictory.

```
 handles_via => [ 'Number', 'Scalar' ]
```

## BUGS

Please report any bugs to \<https://github.com/tobyink/p5-sub-handlesvia/issues\>.

### Potential load order bugs

Unlike Moose, Moo doesn't really offer much of an API for extensions. As a result, most modules that provide extensions do so by wrapping the Moo keywords (especially `"has"`). Sub::HandlesVia is no exception to this. If you are using multiple Moo extensions, you may need to adjust the order you `"use"` them for them to work properly together. In some combinations, there may be no order that fully works!

Some known modules that should be imported *before* Sub::HandlesVia if you're using them: MooX::Should.

Some known modules that should be imported *after* Sub::HandlesVia if you're using them: MooX::ProtectedAttributes.

Some known modules that conflict with Sub::HandlesVia: none so far!

## SEE ALSO

Misc advanced documentation: Sub::HandlesVia::Manual::Advanced.

Sub::HandlesVia.

Documentation for delegatable methods: Sub::HandlesVia::HandlerLibrary::Array, Sub::HandlesVia::HandlerLibrary::Blessed, Sub::HandlesVia::HandlerLibrary::Bool, Sub::HandlesVia::HandlerLibrary::Code, Sub::HandlesVia::HandlerLibrary::Counter, Sub::HandlesVia::HandlerLibrary::Enum, Sub::HandlesVia::HandlerLibrary::Hash, Sub::HandlesVia::HandlerLibrary::Number, Sub::HandlesVia::HandlerLibrary::Scalar, and Sub::HandlesVia::HandlerLibrary::String.

## AUTHOR

Toby Inkster \<tobyink@cpan.org\>.

## COPYRIGHT AND LICENCE

This software is copyright (c) 2022 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

## DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
