Sub::Ha...thMouse(3)
β¨ NAME β¨
Sub::HandlesVia::Manual::WithMouse β using Sub::HandlesVia with Mouse ππ
(yeah it's that perl manpage from User Contributed Perl Documentation, the one the header calls Sub::Ha...thMouse(3) bc the title got squished by the terminal, we love that for it π
)
π 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 lets you delegate methods from your class to the values of your objects' attributes. it's giving "your attribute has a whole personality now" π
Conceptually, it lets you define $object->push_number($n) to be a shortcut for $object->numbers->push($n) β except that $object->numbers is an arrayref, so it doesn't have methods you can call on it like push. no cap, that's the whole trick. β¨
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'. one little swap and you're iconic π«Ά
πΈ Usage in Mouse Roles πΈ
Mouse roles are only partially supported. bestie. π
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! π like genuinely, come be the main character of this repo π
π¦ 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
- String
An arrayref can be provided for handles_via, though many of the options are conceptually contradictory. (we're just out here living dangerously π)
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. slay π
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! not me beating it to the punch π€β¨
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. do it do it do it π
π 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
- 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. yeah. no takesies backsies, bestie π
okay that's the whole page!! it's perl v5.42.0, dated 2026-02-11, and it goes by Sub::Ha...thMouse(3) β mwah, stan, bye π
πβ¨
π¦ where this page comes from
- fedora 44: perl-Sub-HandlesVia 0.053005-1.fc44 Β· GPL-1.0-or-later OR Artistic-1.0-Perl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms