The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

MooseX::CurriedDelegation - Curry your delegations with methods

VERSION

This document describes version 0.002 of MooseX::CurriedDelegation - released May 19, 2014 as part of MooseX-CurriedDelegation.

SYNOPSIS

    use Moose;
    use MooseX::CurriedDelegation;

    has one => (is => 'ro', isa => 'Str', default => 'default');

    has foo => (

        is      => 'rw',
        isa     => 'TestClass::Delagatee', # has method curried()
        default => sub { TestClass::Delagatee->new },

        handles => {

            # method-curry
            #   Note the hashref, not arrayref, we employ
            #   first arg is the remote method to delegate to
            #   second is an arrayref comprising:
            #       coderef to call as a method on the instance, followed by
            #       "static" curry args
            #
            # so, essentially:
            #   $self->foo->remote_method($self->$coderef(), @remaining_args);
            #
            # foo_del_one => {
            #   remote_method => [ sub { ... }, qw{ static args } ],
            # },

            foo_del_one => { curried => [ sub { shift->one }, qw{ more curry args } ] },

            # curry_to_self() always returns: sub { shift }
            foo_del_two => { other_method => [ curry_to_self ] },
        },
    );

DESCRIPTION

Method delegation is awfully handy -- but sometimes it'd be awfully handier if it was a touch more dynamic. This is an attribute trait that provides for a delegated method to be curried.

USAGE

Using this package will cause the relevant attribute trait to be applied without requiring further intervention. We use the standard

    handles => { local_method => delegate_info, ... }

delegation methodology, however our currying is invoked when delegate_info is a hashref. We expect delegate info to look like:

    { remote_method => [ $coderef, @more_curry_args ] }

Only $coderef is ever executed by the delegation. This means that it is safe to have any number of additional coderefs in @more_curry_args: they will be passed through to remote_method without additional manipulation.

ADDITIONAL SUGAR

In addition, we export a number of helper functions.

curry_to_self()

This function always returns a coderef like "sub { shift }". That is, this:

    local => { remote => [ curry_to_self ] }

is equivalent to:

    local => { remote => [ sub { shift } ] }

TRAIT ALIASES

CurriedDelegation

Resolves out to the full name of our attribute trait; you can use it as:

    has foo => (traits => [CurriedDelegation], ...)

SEE ALSO

Please see those modules/websites for more information related to this module.

SOURCE

The development version is on github at http://https://github.com/RsrchBoy/moosex-currieddelegation and may be cloned from git://https://github.com/RsrchBoy/moosex-currieddelegation.git

BUGS

Please report any bugs or feature requests on the bugtracker website https://github.com/RsrchBoy/moosex-currieddelegation/issues

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

AUTHOR

Chris Weyl <cweyl@alumni.drew.edu>

I'm a material boy in a material world

Please note I do not expect to be gittip'ed or flattr'ed for this work, rather it is simply a very pleasant surprise. I largely create and release works like this because I need them or I find it enjoyable; however, don't let that stop you if you feel like it ;)

Flattr this, gittip me, or indulge my Amazon Wishlist... If you so desire.

COPYRIGHT AND LICENSE

This software is Copyright (c) 2012 by Chris Weyl.

This is free software, licensed under:

  The GNU Lesser General Public License, Version 2.1, February 1999