1 package Moose::Meta::Attribute::Native;
3 our $VERSION = '0.89_01';
4 $VERSION = eval $VERSION;
5 our $AUTHORITY = 'cpan:STEVAN';
7 my @trait_names = qw(Bool Counter Number String Array Hash);
9 for my $trait_name (@trait_names) {
10 my $trait_class = "Moose::Meta::Attribute::Native::Trait::$trait_name";
11 my $meta = Class::MOP::Class->initialize(
12 "Moose::Meta::Attribute::Custom::Trait::$trait_name"
14 if ($meta->find_method_by_name('register_implementation')) {
15 my $class = $meta->name->register_implementation;
17 "An implementation for $trait_name already exists " .
18 "(found '$class' when trying to register '$trait_class')"
21 $meta->add_method(register_implementation => sub {
22 # resolve_metatrait_alias will load classes anyway, but throws away
23 # their error message; we WANT to die if there's a problem
24 Class::MOP::load_class($trait_class);
37 Moose::Meta::Attribute::Native - Extend your attribute interfaces
47 isa => 'HashRef[Str]',
48 default => sub { {} },
50 exists_in_mapping => 'exists',
51 ids_in_mapping => 'keys',
54 set_quantity => [ set => [ 'quantity' ] ],
61 my $obj = MyClass->new;
62 $obj->set_quantity(10); # quantity => 10
63 $obj->set_mapping(4, 'foo'); # 4 => 'foo'
64 $obj->set_mapping(5, 'bar'); # 5 => 'bar'
65 $obj->set_mapping(6, 'baz'); # 6 => 'baz'
69 print $obj->get_mapping(5) if $obj->exists_in_mapping(5);
72 print join ', ', $obj->ids_in_mapping;
76 While L<Moose> attributes provide a way to name your accessors, readers,
77 writers, clearers and predicates, this library provides commonly
78 used attribute helper methods for more specific types of data.
80 As seen in the L</SYNOPSIS>, you specify the data structure via the
81 C<trait> parameter. Available meta classes are below; see L</METHOD PROVIDERS>.
83 This module used to exist as the L<MooseX::AttributeHelpers> extension. It was
84 very commonly used, so we moved it into core Moose. Since this gave us a chance
85 to change the interface, you will have to change your code or continue using
86 the L<MooseX::AttributeHelpers> extension.
92 This is like C<< handles >> in L<Moose/has>, but only HASH references are
93 allowed. Keys are method names that you want installed locally, and values are
94 methods from the method providers (below). Currying with delegated methods
95 works normally for C<< handles >>.
97 =head1 METHOD PROVIDERS
101 =item L<Number|Moose::Meta::Attribute::Native::Trait::Number>
103 Common numerical operations.
106 traits => ['Number'],
121 =item L<String|Moose::Meta::Attribute::Native::Trait::String>
123 Common methods for string operations.
126 traits => ['String'],
131 add_text => 'append',
132 replace_text => 'replace',
136 =item L<Counter|Moose::Meta::Attribute::Native::Trait::Counter>
138 Methods for incrementing and decrementing a counter attribute.
141 traits => ['Counter'],
146 inc_counter => 'inc',
147 dec_counter => 'dec',
148 reset_counter => 'reset',
152 =item L<Bool|Moose::Meta::Attribute::Native::Trait::Bool>
154 Common methods for boolean values.
164 flip_switch => 'toggle',
169 =item L<Hash|Moose::Meta::Attribute::Native::Trait::Hash>
171 Common methods for hash references.
176 isa => 'HashRef[Str]',
177 default => sub { {} },
181 has_option => 'exists',
185 =item L<Array|Moose::Meta::Attribute::Native::Trait::Array>
187 Common methods for array references.
192 isa => 'ArrayRef[Str]',
193 default => sub { [] },
196 next_item => 'shift',
204 All complex software has bugs lurking in it, and this module is no
205 exception. If you find a bug please either email me, or add the bug
210 Stevan Little E<lt>stevan@iinteractive.comE<gt>
212 B<with contributions from:>
216 Paul (frodwith) Driver
220 Chris (perigrin) Prather
222 Robert (phaylon) Sedlacek
232 Florian (rafl) Ragwitz
238 =head1 COPYRIGHT AND LICENSE
240 Copyright 2007-2009 by Infinity Interactive, Inc.
242 L<http://www.iinteractive.com>
244 This library is free software; you can redistribute it and/or modify
245 it under the same terms as Perl itself.