Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re: Dynamically adding methods to Moo class

by hippo (Abbot)
on Apr 23, 2014 at 15:56 UTC ( #1083382=note: print w/replies, xml ) Need Help??

in reply to Dynamically adding methods to Moo class

That will depend on what the methods actually do. If they are simple getters/setters then yes, Moo has ways to automagically "generate" those as outlined (or at least hinted at) in the documentation.

For less standard methods you could use the normal approach of extracting the common code into a separate subroutine (or method) and have the individual (now slimmer) methods call that internally.

If you could provide an example of two of your almost identical methods we might be able to discern an appropriate path of action.

  • Comment on Re: Dynamically adding methods to Moo class

Replies are listed 'Best First'.
Re^2: Dynamically adding methods to Moo class
by McA (Priest) on Apr 23, 2014 at 16:14 UTC

    Hi hippo,

    thank you for your fast reply. I really hoped that there is a possibility to use this kind of "method installation infrastructure" Moo must have for e.g. to implement the 'has'-declaration. With this declaration you get later an appropriate sub which you can call as method.

    For an example use case. Assume you have a simple class:

    package Me; use strict; use warnings; use Moo; has 'typ' => ( is => 'ro', required => 1, ); has 'other' => ( is => 'ro', required => 1, ); sub info { my $self = shift; return $self->new( 'typ' => 'INFO', 'other' => "@_", ); }

    The method 'info' is just a convenience constructor for the Moo generated constructor 'new'. If I like to do this for several values of 'typ' I would repeat myself. So I hoped to "create" / "generate" these methods more elegant.


      Don't forget that Moo is still Perl. You can still do all the stuff you could normally do using Perl!

      for my $t (qw/ INFO BINFO WINFO SCHMINFO /) { no strict 'refs'; *{lc $t} = sub { my $class = shift; $class->new( typ => $t, other => "@_" ); }; }
      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

        Thank you, Tobyink. That's what I meant with "Or do I have to tweak with the symbol table?" in my initial question. I thought that this kind of functionality is somewhere accessible in a more "formal" manner. A kind of:

        install_method('method_name', sub {});

        Best regards

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1083382]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2018-02-26 04:33 GMT
Find Nodes?
    Voting Booth?
    When it is dark outside I am happiest to see ...

    Results (316 votes). Check out past polls.