Moxie
view release on metacpan or search on metacpan
lib/Moxie.pm view on Meta::CPAN
else {
push @traits => $trait;
}
}
}
# then schedule the trait collection ...
Method::Traits->import_into( $meta->name, @traits );
# install our class finalizer
MOP::Util::defer_until_UNITCHECK(sub {
# pre-populate the cache for all the slots (if it is a class)
MOP::Util::inherit_slots( $meta );
# apply roles ...
MOP::Util::compose_roles( $meta );
# TODO:
# Consider locking the %HAS hash now, this will
# prevent anyone from adding new fields after
lib/Moxie.pm view on Meta::CPAN
=head1 KEYWORDS
L<Moxie> exports a few keywords using the L<BEGIN::Lift> module
described above. These keywords are responsible for setting
the correct state in the current package such that it conforms
to the expectations of the L<UNIVERSAL::Object> and L<MOP>
modules.
All of these keywords are executed during the C<BEGIN> phase,
and the keywords themselves are removed in the C<UNITCHECK>
phase. This prevents them from being mistaken as methods by
both L<perl> and the L<MOP>.
=over 4
=item C<extends @superclasses>
This creates an inheritance relationship between the current
class and the classes listed in C<@superclasses>.
lib/Moxie.pm view on Meta::CPAN
most part, you don't need to care about the difference.
This will populate the C<@ISA> variable in the current package.
=item C<with @roles>
This sets up a role relationship between the current class or
role and the roles listed in C<@roles>.
This will cause L<Moxie> to compose the C<@roles> into the current
class or role during the next C<UNITCHECK> phase.
This will populate the C<@DOES> variable in the current package.
=item C<< has $name => sub { $default_value } >>
This creates a new slot in the current class or role, with
C<$name> being the name of the slot and a subroutine which,
when called, returns the C<$default_value> for that slot.
This will populate the C<%HAS> variable in the current package.
lib/Moxie/Traits/Provider/Experimental.pm view on Meta::CPAN
Sub::Util::set_prototype( '', $method->body );
# at this point we can assume that we have a lexical
# method which we need to transform, and in order to
# do that we need to look at all the methods in this
# class and find all the ones who 'close over' the
# lexical method and then re-write their lexical pad
# to use the accessor method that I will generate.
# NOTE:
# we need to delay this until the UNITCHECK phase
# because we need all the methods of this class to
# have been compiled, at this moment, they are not.
MOP::Util::defer_until_UNITCHECK(sub {
# now see if this class is immutable or not, it will
# determine the type of accessor we generate ...
my $class_is_immutable = ($meta->name)->isa('Moxie::Object::Immutable');
# now check the class local methods ....
foreach my $m ( $meta->methods ) {
# get a HASH of the things the method closes over
my $closed_over = PadWalker::closed_over( $m->body );
( run in 0.490 second using v1.01-cache-2.11-cpan-748bfb374f4 )