MooseX-CurriedHandles

 view release on metacpan or  search on metacpan

lib/MooseX/CurriedHandles.pm  view on Meta::CPAN

package MooseX::CurriedHandles;
use Moose;
use Scalar::Util qw(blessed);
our $VERSION = '0.03';
extends 'Moose::Meta::Attribute';

has curried_handles => ( is => 'ro', isa => 'HashRef', default => sub { {} } );

after 'attach_to_class' => sub {
    my ($attr, $class) = @_;

    foreach my $method_name (keys %{ $attr->curried_handles }) {
        $class->add_method($method_name, 
            $attr->generate_curried_accessor($attr->curried_handles->{$method_name})
        );
    }
};

sub generate_curried_accessor {
    my ($attr, $spec) = @_;
    my $attrname = $attr->name;
    my ($delegate_method, $callbacks) = %$spec;
    
    sub { 
        my $self = shift; 
        my $value = $self->$attrname;
        my @method_params = map { $self->$_ } @$callbacks;
        return $value->$delegate_method( @method_params, @_ );
    };
}

1;

package Moose::Meta::Attribute::Custom::MyCurriedHandles;

sub register_implementation {
    'MooseX::CurriedHandles'
}

1;


__END__
=head1 NAME

MooseX::CurriedHandles - Delegate methods to member objects, curried with more methods!

=head1 VERSION

Version 0.03

=cut



=head1 SYNOPSIS

    package MyClass;

    use Moose;
    use MooseX::CurriedHandles;

    has foo => (
        isa => 'Str',
        is => 'ro',
        required => 0,
    );



( run in 1.384 second using v1.01-cache-2.11-cpan-f56aa216473 )