X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo.pm;h=ae3277eda18dad78d238badf03fc8f1cadcc2d89;hb=5d5bb71d96bad0fb8d1d7542d94fa89122a46f12;hp=efe18f0792b6f31b5cf82a09b9001803df3eba36;hpb=505f8b7ac27f299ab035f3f0f40a022f5b88d391;p=gitmo%2FRole-Tiny.git diff --git a/lib/Moo.pm b/lib/Moo.pm index efe18f0..ae3277e 100644 --- a/lib/Moo.pm +++ b/lib/Moo.pm @@ -15,12 +15,13 @@ sub import { return if $MAKERS{$target}; # already exported into this package *{_getglob("${target}::extends")} = sub { _load_module($_) for @_; - *{_getglob("${target}::ISA")} = \@_; + # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA + @{*{_getglob("${target}::ISA")}{ARRAY}} = @_; }; *{_getglob("${target}::with")} = sub { require Moo::Role; die "Only one role supported at a time by with" if @_ > 1; - Moo::Role->apply_role_to_package($_[0], $target); + Moo::Role->apply_role_to_package($target, $_[0]); }; $MAKERS{$target} = {}; *{_getglob("${target}::has")} = sub { @@ -77,12 +78,20 @@ sub _constructor_maker_for { 1; -=pod - =head1 NAME Moo - Minimalist Object Orientation (with Moose compatiblity) +=head1 WARNING WARNING WARNING + +This is a 0.9 release because we're fairly sure it works. For us. Until it's +tested in the wild, we make no guarantees it also works for you. + +If this module does something unexpected, please submit a failing test. + +But if it eats your cat, sleeps with your boyfriend, or pushes grandma down +the stairs to save her from the terrible secret of space, it's not our fault. + =head1 SYNOPSIS package Cat::Food; @@ -137,6 +146,26 @@ thirds of L. Unlike C this module does not aim at full L compatibility. See L for more details. +=head1 WHY MOO EXISTS + +If you want a full object system with a rich Metaprotocol, L is +already wonderful. + +I've tried several times to use L but it's 3x the size of Moo and +takes longer to load than most of my Moo based CGI scripts take to run. + +If you don't want L, you don't want "less metaprotocol" like L, +you want "as little as possible" - which means "no metaprotocol", which is +what Moo provides. + +By Moo 1.0 I intend to have Moo's equivalent of L built in - +if Moose gets loaded, any Moo class or role will act as a Moose equivalent +if treated as such. + +Hence - Moo exists as its name - Minimal Object Orientation - with a pledge +to make it smooth to upgrade to L when you need more than minimal +features. + =head1 IMPORTED METHODS =head2 new @@ -147,6 +176,10 @@ or Foo::Bar->new({ attr1 => 3 }); +=head2 BUILDARGS + +This feature from Moose is not yet supported. + =head2 BUILDALL Don't override (or probably even call) this method. Instead, you can define @@ -168,7 +201,11 @@ Returns true if the object composes in the passed role. extends 'Parent::Class'; -Declares base class +Declares base class. Multiple superclasses can be passed for multiple +inheritance (but please use roles instead). + +Calling extends more than once will REPLACE your superclasses, not add to +them like 'use base' would. =head2 with @@ -210,6 +247,10 @@ L =item * coerce +This Moose feature is not yet supported + +=begin hide + Takes a coderef which is meant to coerce the attribute. The basic idea is to do something like the following: @@ -219,29 +260,48 @@ do something like the following: L +=end hide + =item * trigger Takes a coderef which will get called any time the attribute is set. Coderef will be invoked against the object with the new value as an argument. +Note that Moose also passes the old value, if any; this feature is not yet +supported. + L =item * default -Takes a coderef which will get called to populate an attribute. +Takes a coderef which will get called with $self as its only argument +to populate an attribute if no value is supplied to the constructor - or +if the attribute is lazy, when the attribute is first retrieved if no +value has yet been provided. + +Note that if your default is fired during new() there is no guarantee that +other attributes have been populated yet so you should not rely on their +existence. L =item * predicate -Takes a method name which will return true if an attribute has been set. +Takes a method name which will return true if an attribute has a value. A common example of this would be to call it C, implying that the object has a C<$foo> set. =item * builder -Takes a method name which will be called to create the attribute. +Takes a method name which will be called to create the attribute - functions +exactly like default except that instead of calling + + $default->($self); + +Moo will call + + $self->$builder; =item * clearer @@ -292,14 +352,13 @@ documentation. See L<< Class::Method::Modifiers/after method(s) => sub { ... } >> for full documentation. - =head1 SUB QUOTE AWARE L allows us to create coderefs that are "inlineable," giving us a handy, XS-free speed boost. Any option that is L aware can take advantage of this. -=head1 INCOMPATIBILITIES +=head1 INCOMPATIBILITIES WITH MOOSE You can only compose one role at a time. If your application is large or complex enough to warrant complex composition, you wanted L. @@ -308,12 +367,16 @@ There is no complex type system. C is verified with a coderef, if you need complex types, just make a library of coderefs, or better yet, functions that return quoted subs. -C is not supported in core, but with an extension it is supported. +C is not supported in core since the author considers it to be a +bad idea but may be supported by an extension in future. There is no meta object. If you need this level of complexity you wanted -L. +L - Moo succeeds at being small because it explicitly does not +provide a metaprotocol. -No support for C, C, C, or C. +No support for C, C, C, or C - override can +be handled by around albeit with a little more typing, and the author considers +augment to be a bad idea. L only supports coderefs, because doing otherwise is usually a mistake anyway. @@ -321,6 +384,6 @@ mistake anyway. C is not supported per se, but of course it will work if you manually set all the options it implies. -C is not supported. +C is not supported since the author considers it a bad idea. -C is not supported. +C is not supported since it's a very poor replacement for POD.