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

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