This is an automated email from the git hooks/post-receive script.

gregoa pushed a commit to annotated tag release-0.001
in repository libclass-tiny-perl.

commit dd16a6c22d2d86687ae973957d4f568e636200a9
Author: David Golden <dagol...@cpan.org>
Date:   Fri Aug 16 07:15:34 2013 -0400

    add support for BUILD methods
---
 lib/Class/Tiny.pm | 18 ++++++++++++++++--
 t/delta.t         | 30 ++++++++++++++++++++++++++++++
 t/echo.t          | 31 +++++++++++++++++++++++++++++++
 t/lib/Delta.pm    | 19 +++++++++++++++++++
 t/lib/Echo.pm     | 15 +++++++++++++++
 5 files changed, 111 insertions(+), 2 deletions(-)

diff --git a/lib/Class/Tiny.pm b/lib/Class/Tiny.pm
index d0c7262..9fd19ba 100644
--- a/lib/Class/Tiny.pm
+++ b/lib/Class/Tiny.pm
@@ -60,7 +60,13 @@ sub new {
     if (@bad) {
         Carp::croak("Invalid attributes for $class: @bad");
     }
-    return bless $args, $class;
+    my $self = bless $args, $class;
+    for my $s ( reverse @search ) {
+        no strict 'refs';
+        my $builder = *{ $s . "::BUILD" }{CODE};
+        $self->$builder if defined $builder;
+    }
+    return $self;
 }
 
 1;
@@ -197,7 +203,15 @@ hash or an exception is thrown.  A shallow copy is made of 
the reference provide
 
 =head2 BUILD
 
-To be implemented...
+If the class or any superclass defines a C<BUILD> method, they will be called
+by the constructor from furthest parent to child after the object has been
+created.  No arguments are provided and the return value is ignored.  Use them
+for validation or setting default values.
+
+    sub BUILD {
+        my $self = shift;
+        $self->foo(42) unless defined $self->foo;
+    }
 
 =head2 DEMOLISH
 
diff --git a/t/delta.t b/t/delta.t
new file mode 100644
index 0000000..26c75d8
--- /dev/null
+++ b/t/delta.t
@@ -0,0 +1,30 @@
+use 5.008001;
+use strict;
+use warnings;
+use Test::More 0.96;
+use Test::FailWarnings;
+use Test::Deep '!blessed';
+use Test::Fatal;
+
+use lib 't/lib';
+
+require_ok("Delta");
+
+subtest "attribute set as list" => sub {
+    my $obj = new_ok( "Delta", [ foo => 42, bar => 23 ] );
+    is( $obj->foo, 42, "foo is set" );
+    is( $obj->bar, 23, "bar is set" );
+};
+
+subtest "exceptions" => sub {
+    like(
+        exception { Delta->new( foo => 0 ) },
+        qr/foo must be positive/,
+        "BUILD validation throws error",
+    );
+
+};
+
+done_testing;
+# COPYRIGHT
+# vim: ts=4 sts=4 sw=4 et:
diff --git a/t/echo.t b/t/echo.t
new file mode 100644
index 0000000..d95169e
--- /dev/null
+++ b/t/echo.t
@@ -0,0 +1,31 @@
+use 5.008001;
+use strict;
+use warnings;
+use Test::More 0.96;
+use Test::FailWarnings;
+use Test::Deep '!blessed';
+use Test::Fatal;
+
+use lib 't/lib';
+
+require_ok("Echo");
+
+subtest "attribute set as list" => sub {
+    my $obj = new_ok( "Echo", [ foo => 42, bar => 23 ] );
+    is( $obj->foo, 42, "foo is set" );
+    is( $obj->bar, 23, "bar is set" );
+    is( $obj->baz, 24, "baz is set" );
+};
+
+subtest "exceptions" => sub {
+    like(
+        exception { Echo->new( foo => 0, bar => 23 ) },
+        qr/foo must be positive/,
+        "BUILD validation throws error",
+    );
+
+};
+
+done_testing;
+# COPYRIGHT
+# vim: ts=4 sts=4 sw=4 et:
diff --git a/t/lib/Delta.pm b/t/lib/Delta.pm
new file mode 100644
index 0000000..670c308
--- /dev/null
+++ b/t/lib/Delta.pm
@@ -0,0 +1,19 @@
+use 5.008001;
+use strict;
+use warnings;
+
+package Delta;
+
+use Carp ();
+
+use Class::Tiny qw/foo bar/;
+
+sub BUILD {
+    my $self = shift;
+    Carp::croak("foo must be positive")
+      unless defined $self->foo && $self->foo > 0;
+
+    $self->bar(42) unless defined $self->bar;
+}
+
+1;
diff --git a/t/lib/Echo.pm b/t/lib/Echo.pm
new file mode 100644
index 0000000..36d6727
--- /dev/null
+++ b/t/lib/Echo.pm
@@ -0,0 +1,15 @@
+use 5.008001;
+use strict;
+use warnings;
+
+package Echo;
+use base 'Delta';
+
+use Class::Tiny qw/baz/;
+
+sub BUILD {
+    my $self = shift;
+    $self->baz( $self->bar + 1 );
+}
+
+1;

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libclass-tiny-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to