This commit is contained in:
160
CPAN/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod
Normal file
160
CPAN/Moose/Cookbook/Extending/Mooseish_MooseSugar.pod
Normal file
@@ -0,0 +1,160 @@
|
||||
# PODNAME: Moose::Cookbook::Extending::Mooseish_MooseSugar
|
||||
# ABSTRACT: Acting like Moose.pm and providing sugar Moose-style
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Moose::Cookbook::Extending::Mooseish_MooseSugar - Acting like Moose.pm and providing sugar Moose-style
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.2207
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
package MyApp::Mooseish;
|
||||
|
||||
use Moose::Exporter;
|
||||
|
||||
Moose::Exporter->setup_import_methods(
|
||||
with_meta => ['has_table'],
|
||||
class_metaroles => {
|
||||
class => ['MyApp::Meta::Class::Trait::HasTable'],
|
||||
},
|
||||
);
|
||||
|
||||
sub has_table {
|
||||
my $meta = shift;
|
||||
$meta->table(shift);
|
||||
}
|
||||
|
||||
package MyApp::Meta::Class::Trait::HasTable;
|
||||
use Moose::Role;
|
||||
|
||||
has table => (
|
||||
is => 'rw',
|
||||
isa => 'Str',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This recipe expands on the use of L<Moose::Exporter> we saw in
|
||||
L<Moose::Cookbook::Extending::ExtensionOverview> and the class metaclass trait
|
||||
we saw in L<Moose::Cookbook::Meta::Table_MetaclassTrait>. In this example we
|
||||
provide our own metaclass trait, and we also export a C<has_table> sugar
|
||||
function.
|
||||
|
||||
The C<with_meta> parameter specifies a list of functions that should
|
||||
be wrapped before exporting. The wrapper simply ensures that the
|
||||
importing package's appropriate metaclass object is the first argument
|
||||
to the function, so we can do C<S<my $meta = shift;>>.
|
||||
|
||||
See the L<Moose::Exporter> docs for more details on its API.
|
||||
|
||||
=head1 USING MyApp::Mooseish
|
||||
|
||||
The purpose of all this code is to provide a Moose-like
|
||||
interface. Here's what it would look like in actual use:
|
||||
|
||||
package MyApp::User;
|
||||
|
||||
use namespace::autoclean;
|
||||
|
||||
use Moose;
|
||||
use MyApp::Mooseish;
|
||||
|
||||
has_table 'User';
|
||||
|
||||
has 'username' => ( is => 'ro' );
|
||||
has 'password' => ( is => 'ro' );
|
||||
|
||||
sub login { ... }
|
||||
|
||||
=head1 CONCLUSION
|
||||
|
||||
Providing sugar functions can make your extension look much more
|
||||
Moose-ish. See L<Fey::ORM> for a more extensive example.
|
||||
|
||||
=begin testing
|
||||
|
||||
{
|
||||
package MyApp::User;
|
||||
|
||||
use Moose;
|
||||
MyApp::Mooseish->import;
|
||||
|
||||
has_table( 'User' );
|
||||
|
||||
has( 'username' => ( is => 'ro' ) );
|
||||
has( 'password' => ( is => 'ro' ) );
|
||||
|
||||
sub login { }
|
||||
}
|
||||
|
||||
can_ok( MyApp::User->meta, 'table' );
|
||||
is( MyApp::User->meta->table, 'User',
|
||||
'MyApp::User->meta->table returns User' );
|
||||
ok( MyApp::User->can('username'),
|
||||
'MyApp::User has username method' );
|
||||
|
||||
=end testing
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
=over 4
|
||||
|
||||
=item *
|
||||
|
||||
Stevan Little <stevan@cpan.org>
|
||||
|
||||
=item *
|
||||
|
||||
Dave Rolsky <autarch@urth.org>
|
||||
|
||||
=item *
|
||||
|
||||
Jesse Luehrs <doy@cpan.org>
|
||||
|
||||
=item *
|
||||
|
||||
Shawn M Moore <sartak@cpan.org>
|
||||
|
||||
=item *
|
||||
|
||||
יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
|
||||
|
||||
=item *
|
||||
|
||||
Karen Etheridge <ether@cpan.org>
|
||||
|
||||
=item *
|
||||
|
||||
Florian Ragwitz <rafl@debian.org>
|
||||
|
||||
=item *
|
||||
|
||||
Hans Dieter Pearcey <hdp@cpan.org>
|
||||
|
||||
=item *
|
||||
|
||||
Chris Prather <chris@prather.org>
|
||||
|
||||
=item *
|
||||
|
||||
Matt S Trout <mstrout@cpan.org>
|
||||
|
||||
=back
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2006 by Infinity Interactive, Inc.
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user