use strict; use warnings; package MooseX::Declare; use aliased 'MooseX::Declare::Syntax::Keyword::Class', 'ClassKeyword'; use aliased 'MooseX::Declare::Syntax::Keyword::Role', 'RoleKeyword'; use namespace::clean; our $VERSION = '0.22'; sub import { my ($class, %args) = @_; my $caller = caller(); strict->import; warnings->import; for my $keyword ($class->keywords) { $keyword->setup_for($caller, %args); } } sub keywords { ClassKeyword->new(identifier => 'class'), RoleKeyword->new(identifier => 'role'), } 1; __END__ =head1 NAME MooseX::Declare - Declarative syntax for Moose =head1 SYNOPSIS use MooseX::Declare; class BankAccount { has 'balance' => ( isa => 'Num', is => 'rw', default => 0 ); method deposit (Num $amount) { $self->balance( $self->balance + $amount ); } method withdraw (Num $amount) { my $current_balance = $self->balance(); ( $current_balance >= $amount ) || confess "Account overdrawn"; $self->balance( $current_balance - $amount ); } } class CheckingAccount extends BankAccount { has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' ); before withdraw (Num $amount) { my $overdraft_amount = $amount - $self->balance(); if ( $self->overdraft_account && $overdraft_amount > 0 ) { $self->overdraft_account->withdraw($overdraft_amount); $self->deposit($overdraft_amount); } } } =head1 DESCRIPTION This module provides syntactic sugar for Moose, the postmodern object system for Perl 5. When used, it sets up the C and C keywords. =head1 KEYWORDS =head2 class class Foo { ... } my $anon_class = class { ... }; Declares a new class. The class can be either named or anonymous, depending on whether or not a classname is given. Within the class definition Moose and L are set up automatically in addition to the other keywords described in this document. At the end of the definition the class will be made immutable. namespace::autoclean is injected to clean up Moose and other imports for you. Because of the way the options are parsed, you cannot have a class named "is", "with" or "extends". It's possible to specify options for classes: =over 4 =item extends class Foo extends Bar { ... } Sets a superclass for the class being declared. =item with class Foo with Role { ... } Applies a role to the class being declared. =item is mutable class Foo is mutable { ... } Causes the class not to be made immutable after its definition. Options can also be provided for anonymous classes using the same syntax: my $meta_class = class with Role; =back =head2 role role Foo { ... } my $anon_role = role { ... }; Declares a new role. The role can be either named or anonymous, depending on whether or not a name is given. Within the role definition Moose::Role and MooseX::Method::Signatures are set up automatically in addition to the other keywords described in this document. Again, namespace::autoclean is injected to clean up Moose::Role and other imports for you. It's possible to specify options for roles: =over 4 =item with role Foo with Bar { ... } Applies a role to the role being declared. =back =head2 before / after / around / override / augment before foo ($x, $y, $z) { ... } after bar ($x, $y, $z) { ... } around baz ($x, $y, $z) { ... } override moo ($x, $y, $z) { ... } augment kuh ($x, $y, $z) { ... } Add a method modifier. Those work like documented in L, except for the slightly nicer syntax and the method signatures, which work like documented in L. For the C modifier an additional argument called C<$orig> is automatically set up as the invocant for the method. =head2 clean Sometimes you don't want the automatic cleaning the C and C keywords provide using namespace::autoclean. In those cases you can specify the C trait for your class or role: use MooseX::Declare; class Foo is dirty { ... } This will prevent cleaning of your namespace, except for the keywords imported from C or C. Additionally, a C keyword is provided, which allows you to explicitly clean all functions that were defined prior to calling C. Here's an example: use MooseX::Declare; class Foo is dirty { sub helper_function { ... } clean; method foo ($stuff) { ...; return helper_function($stuff); } } With that, the helper function won't be available as a method to a user of your class, but you're still able to use it inside your class. =head1 NOTE ON IMPORTS When creating a class with MooseX::Declare like: use MooseX::Declare; class Foo { ... } What actually happens is something like this: { package Foo; use Moose; use namespace::autoclean; ... __PACKAGE__->meta->make_immutable; } So if you declare imports outside the class, the symbols get imported into the C namespace, not the class' namespace. The symbols then cannot be called from within the class: use MooseX::Declare; use Data::Dump qw/dump/; class Foo { method dump($value) { return dump($value) } # Data::Dump::dump IS NOT in Foo:: method pp($value) { $self->dump($value) } # an alias for our dump method } To solve this, only import MooseX::Declare outside the class definition (because you have to). Make all other imports inside the class definition. use MooseX::Declare; class Foo { use Data::Dump qw/dump/; method dump($value) { return dump($value) } # Data::Dump::dump IS in Foo:: method pp($value) { $self->dump($value) } # an alias for our dump method } Foo->new->dump($some_value); Foo->new->pp($some_value); B that the import C and the method C, although having the same name, do not conflict with each other, because the imported C function will be cleaned during compile time, so only the method remains there at run time. If you want to do more esoteric things with imports, have a look at the C keyword and the C trait. =head1 SEE ALSO L L L L vim syntax: L emacs syntax: L =head1 AUTHOR Florian Ragwitz Erafl@debian.orgE With contributions from: =over 4 =item Ash Berlin Eash@cpan.orgE =item Hans Dieter Pearcey Ehdp@cpan.orgE =item Matt Kraai Ekraai@ftbfs.orgE =item Nelo Onyiah Enelo.onyiah@gmail.comE =item nperez Enperez@cpan.orgE =item Piers Cawley Epdcawley@bofh.org.ukE =item Stevan Little Estevan.little@iinteractive.comE =item Tomas Doran Ebobtfish@bobtfish.netE =item Yanick Champoux Eyanick@babyl.dyndns.orgE =back =head1 COPYRIGHT AND LICENSE Copyright (c) 2008, 2009 Florian Ragwitz Licensed under the same terms as perl itself. =cut