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

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

using Sub::HandlesVia with Mouse

## NAME

Sub::HandlesVia::Manual::WithMouse - using Sub::HandlesVia with Mouse

## SYNOPSIS

```
 package Kitchen {
   use Mouse;
   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 mouse in your kitchen, that might not be very hygienic.)

## 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 MouseX::NativeTraits, just replacing `"traits => ['Array']"` in an attribute definition with `"handles_via => 'Array'"`.

### Usage in Mouse Roles

Mouse roles are only partially supported.

```
 package R1 {
   use Mouse:Role;
 }

 package R2 {
   use Mouse:Role;
   use Sub::HandlesVia;

   # define some attributes with delegation
 }

 # This class is broken.
 package C1 {
   use Mouse;
   with 'R1', 'R2';
 }

 # This class should work.
 package C2 {
   use Mouse;
   with 'R1';
   with 'R2';
 }
```

For details, see \<https://github.com/tobyink/p5-sub-handlesvia/issues/9\>.

Patches to fix the issue are very welcome!

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

### Mouse Native Types

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

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

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

### True MouseX::NativeTraits Drop-In Syntax

Sub::HandlesVia will also recognize MouseX::NativeTraits-style `"traits"`. It will jump in and handle them before MouseX::NativeTraits notices!

```
 package Kitchen {
   use Mouse;
   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.
