Toby Inkster avatar Toby Inkster committed 60a79ba

make lazy defaults easier

Comments (0)

Files changed (3)

lib/MooX/Struct.pm

 
 =head1 SEE ALSO
 
-L<Moo>, L<MooseX::Struct>, L<Class::Struct>.
+L<Moo>, L<MooX::Struct::Util>, L<MooseX::Struct>, L<Class::Struct>.
 
 =head1 AUTHOR
 

lib/MooX/Struct/Util.pm

+package MooX::Struct::Util;
+
+use strict;
+use Sub::Install qw(install_sub);
+
+sub import
+{
+	my $class  = shift;
+	my $caller = caller;
+	install_sub { code => $_, from => $class, into => $caller } for @_;
+}
+
+sub lazy_default (&)
+{
+	my $sub = shift;
+	return [
+		lazy    => 1,
+		default => $sub,
+	];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+MooX::Struct::Util - extensions for MooX::Struct that would have been overkill to include
+
+=head1 LAZY DEFAULTS
+
+Sugar for lazily defaulted attributes. The following two are effectively
+the same.
+
+ use MooX::Struct WebPage1 => [
+    user_agent => [
+       lazy     => 1,
+       default  => sub { LWP::UserAgent->new },
+    ],
+ ];
+ 
+ use MooX::Struct::Util qw(lazy_default);
+ use MooX::Struct WebPage2 => [
+    user_agent => lazy_default { LWP::UserAgent->new },
+ ];
+
+=head1 BUGS
+
+Please report any bugs to
+L<http://rt.cpan.org/Dist/Display.html?Queue=MooX-Struct>.
+
+=head1 SEE ALSO
+
+L<MooX::Struct>.
+
+=head1 AUTHOR
+
+Toby Inkster E<lt>tobyink@cpan.orgE<gt>.
+
+=head1 COPYRIGHT AND LICENCE
+
+This software is copyright (c) 2012 by Toby Inkster.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=head1 DISCLAIMER OF WARRANTIES
+
+THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+use Test::More;
+
+use MooX::Struct::Util qw/ lazy_default /;
+use MooX::Struct Point => [ '+x', '+y' ];
+use MooX::Struct Line  => [ '$start' => lazy_default { Point[] }, '$end' ];
+
+my $line = Line->new( end => Point[ 2, 3 ] );
+is("$line", "0 0 2 3");
+
+done_testing();
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.