use 5.008;
use strict;
use warnings;

package Sub::HandlesVia::HandlerLibrary::Blessed;

our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION   = '0.050001';

use Sub::HandlesVia::HandlerLibrary;
our @ISA = 'Sub::HandlesVia::HandlerLibrary';

use Sub::HandlesVia::Handler qw( handler );
use Types::Standard qw( is_Str );

# Non-exhaustive list!
sub handler_names {
	return;
}

sub has_handler {
	my ($me, $handler_name) = @_;
	is_Str $handler_name;
}

my $simple_method_name = qr/\A[^\W0-9]\w*\z/;
sub get_handler {
	my ($me, $handler_name) = @_;
	
	if ( $handler_name =~ $simple_method_name ) {
		return handler(
			name      => 'Blessed:' . $handler_name,
			template  => sprintf(
				'use Scalar::Util (); ⸨q{$ATTRNAME is not a blessed object}⸩ unless Scalar::Util::blessed( $GET ); $GET->%s(@ARG)',
				$handler_name,
			),
			is_mutator => 0,
		);
	}
	else {
		return handler(
			name      => 'Blessed:' . $handler_name,
			template  => sprintf(
				'use Scalar::Util (); ⸨q{$ATTRNAME is not a blessed object}⸩ unless Scalar::Util::blessed( $GET ); $GET->${\ %s }(@ARG)',
				B::perlstring($handler_name),
			),
			is_mutator => 0,
		);
	}
}

1;

__END__

=head1 NAME

Sub::HandlesVia::HandlerLibrary::Blessed - library of object-related methods

=head1 SYNOPSIS

  package My::Class {
    use Moo;
    use Sub::HandlesVia;
    use Types::Standard 'Object';
    use HTTP::Tiny;
    has http_ua => (
      is => 'rwp',
      isa => Object,
      handles_via => 'Blessed',
      handles => {
        'http_get'  => 'get',
        'http_post' => 'post',
      },
      default => sub { HTTP::Tiny->new },
    );
  }

=head1 DESCRIPTION

This is a library of methods for L<Sub::HandlesVia>.

=head1 DELEGATABLE METHODS

Unlike the other libraries supplied by Sub::HandlesVia, this library allows
you to delegate to I<any> method name.

It assumes that the attribute value is a blessed object, and calls the
correspondingly named method on it.

L<Moo>, L<Moose>, L<Mouse>, and L<Mite> all have this kind of delegation
built-in anyway, but this module allows you to perform the delegation using
Sub::HandlesVia. This may be useful for L<Object::Pad> and L<Class::Tiny>,
which don't have a built-in delegation feature.

=head1 BUGS

Please report any bugs to
L<https://github.com/tobyink/p5-sub-handlesvia/issues>.

=head1 SEE ALSO

L<Sub::HandlesVia>.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

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.

=head1 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.