---
name: "Sub::HandlesVia::Manual::WithMoose"
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::WithMoose"
---

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

using Sub::HandlesVia with Moose

## NAME

Sub::HandlesVia::Manual::WithMoose - using Sub::HandlesVia with Moose

## SYNOPSIS

```
 package Kitchen {
   use Moose;
   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',
     },
   );
 }
```

(If you have a moose in your kitchen, that might be a disaster!)

## 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"`.

Moose does have a built-in feature (native traits) which provides a more limited version of this.

### 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' ]
```

### Moose Native Types

Although the synopsis shows Types::Standard being used for type constraints, Moose native types should also work fine.

```
 package Kitchen {
   use Moose;
   use Sub::HandlesVia;

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

### True Moose Native Traits Drop-In Syntax

Sub::HandlesVia will also recognize native-traits-style traits. It will jump in and handle them before Moose notices!

```
 package Kitchen {
   use Moose;
   use Sub::HandlesVia;

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

## BUGS

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

## 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.
