This is an automated email from the git hooks/post-receive script. js pushed a commit to tag 0.043_02 in repository libtype-tiny-perl.
commit 3686bdd54d47447cb3b3017e53272e823384d94c Author: Toby Inkster <m...@tobyinkster.co.uk> Date: Thu Apr 10 12:02:33 2014 +0100 my_methods stuff --- lib/Type/Tiny.pm | 57 +++++++++++++++++++++++++++++++++++---- lib/Type/Tiny/Manual/Policies.pod | 5 ++++ t/20-unit/Type-Tiny/my-methods.t | 39 +++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/lib/Type/Tiny.pm b/lib/Type/Tiny.pm index 2092a63..64d6efa 100644 --- a/lib/Type/Tiny.pm +++ b/lib/Type/Tiny.pm @@ -254,6 +254,7 @@ sub parameters { $_[0]{parameters} } sub moose_type { $_[0]{moose_type} ||= $_[0]->_build_moose_type } sub mouse_type { $_[0]{mouse_type} ||= $_[0]->_build_mouse_type } sub deep_explanation { $_[0]{deep_explanation} } +sub my_methods { $_[0]{my_methods} ||= $_[0]->_build_my_methods } sub has_parent { exists $_[0]{parent} } sub has_library { exists $_[0]{library} } @@ -977,10 +978,33 @@ sub isa { return !!1; } - + $self->SUPER::isa(@_); } +sub _build_my_methods +{ + return {}; +} + +sub _lookup_my_method +{ + my $self = shift; + my ($name) = @_; + + if ($self->my_methods->{$name}) + { + return $self->my_methods->{$name}; + } + + if ($self->has_parent) + { + return $self->parent->_lookup_my_method(@_); + } + + return; +} + sub can { my $self = shift; @@ -990,9 +1014,18 @@ sub can my $can = $self->SUPER::can(@_); return $can if $can; - if ($INC{"Moose.pm"} and ref($self) and my $method = $self->moose_type->can(@_)) + if (ref($self)) { - return sub { $method->(shift->moose_type, @_) }; + if ($INC{"Moose.pm"}) + { + my $method = $self->moose_type->can(@_); + return sub { shift->moose_type->$method(@_) }; + } + if ($_[0] =~ /\Amy_(.+)\z/) + { + my $method = $self->_lookup_my_method($1); + return $method if $method; + } } return; @@ -1004,9 +1037,18 @@ sub AUTOLOAD my ($m) = (our $AUTOLOAD =~ /::(\w+)$/); return if $m eq 'DESTROY'; - if ($INC{"Moose.pm"} and ref($self) and my $method = $self->moose_type->can($m)) + if (ref($self)) { - return $method->($self->moose_type, @_); + if ($INC{"Moose.pm"}) + { + my $method = $self->moose_type->can($m); + return $self->moose_type->$method(@_) if $method; + } + if ($m =~ /\Amy_(.+)\z/) + { + my $method = $self->_lookup_my_method($1); + return $self->$method(@_) if $method; + } } _croak q[Can't locate object method "%s" via package "%s"], $m, ref($self)||$self; @@ -1187,6 +1229,11 @@ You may pass C<< coercion => 1 >> to the constructor to inherit coercions from the constraint's parent. (This requires the parent constraint to have a coercion.) +=item C<< my_methods >> + +Experimenal hashref of additional methods that can be called on the type +constraint object. + =back =head3 Attributes related to parameterizable and parameterized types diff --git a/lib/Type/Tiny/Manual/Policies.pod b/lib/Type/Tiny/Manual/Policies.pod index e995308..4fbc3d3 100644 --- a/lib/Type/Tiny/Manual/Policies.pod +++ b/lib/Type/Tiny/Manual/Policies.pod @@ -54,6 +54,11 @@ This is experimental. See L<Type::Utils>. =item * +L<Type::Tiny>'s C<my_methods> attribute and the functionality it +provides is experimental. + +=item * + The L<parameterizable coercion API|Type::Coercion> is subject to change. =item * diff --git a/t/20-unit/Type-Tiny/my-methods.t b/t/20-unit/Type-Tiny/my-methods.t new file mode 100644 index 0000000..ce233ca --- /dev/null +++ b/t/20-unit/Type-Tiny/my-methods.t @@ -0,0 +1,39 @@ +=pod + +=encoding utf-8 + +=head1 PURPOSE + +Checks Type::Tiny's C<my_methods> attribute. + +=head1 AUTHOR + +Toby Inkster E<lt>toby...@cpan.orge<gt>. + +=head1 COPYRIGHT AND LICENCE + +This software is copyright (c) 2014 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. + +=cut + +use strict; +use warnings; +use lib qw( ./lib ./t/lib ../inc ./inc ); +use Test::More; + +use Types::Standard qw(Num); + +my $type = Num->create_child_type( + name => 'Number', + my_methods => { round_off => sub { int($_[1]) } } +); + +my $type2 = $type->create_child_type(name => 'Number2'); + +can_ok($_, 'my_round_off') for $type, $type2; +is($_->my_round_off(42.3), 42, "$_ my_round_off works") for $type, $type2; + +done_testing; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libtype-tiny-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits