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

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

commit 27e88d6cbe9948001090a2fc887880e877cddf79
Author: David Golden <dagol...@cpan.org>
Date:   Tue Aug 20 17:32:39 2013 -0400

    add attribute introspection
---
 README.pod        | 11 ++++++++++-
 lib/Class/Tiny.pm | 32 ++++++++++++++++++++++----------
 t/baker.t         |  8 ++++++++
 t/foxtrot.t       |  8 ++++++++
 4 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/README.pod b/README.pod
index 8b41171..7c9b04e 100644
--- a/README.pod
+++ b/README.pod
@@ -104,7 +104,7 @@ I looked for something like it on CPAN, but after checking 
a dozen class
 creators I realized I could implement it exactly how I wanted faster than I
 could search CPAN for something merely sufficient.
 
-=for Pod::Coverage new
+=for Pod::Coverage new get_all_attribute_for
 
 =head1 USAGE
 
@@ -209,6 +209,15 @@ values and errors are ignored.
         $self->cleanup();
     }
 
+=head2 Introspection
+
+You can retrieve an unsorted list of valid attributes known to Class::Tiny
+for a class and its superclasses with the C<get_all_attributes_for> class
+method.
+
+    my @attrs = Class::Tiny->get_all_attributes_for("Employee");
+    # @attrs contains qw/name ssn/
+
 =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants 
kwalitee diff irc mailto metadata placeholders metacpan
 
 =head1 SUPPORT
diff --git a/lib/Class/Tiny.pm b/lib/Class/Tiny.pm
index 8885ba3..cc53c05 100644
--- a/lib/Class/Tiny.pm
+++ b/lib/Class/Tiny.pm
@@ -8,6 +8,13 @@ package Class::Tiny;
 
 use Carp ();
 
+if ( $] >= 5.010 ) {
+    require "mro.pm"; ## no critic: hack to hide from min version & prereq 
scanners
+}
+else {
+    require MRO::Compat;
+}
+
 my %CLASS_ATTRIBUTES;
 
 # adapted from Object::Tiny and Object::Tiny::RW
@@ -32,19 +39,15 @@ sub import {
     return 1;
 }
 
+sub get_all_attributes_for {
+    my ($class, $pkg) = @_;
+    return map { keys %{ $CLASS_ATTRIBUTES{$_} || {} } } @{ 
mro::get_linear_isa($pkg) };
+}
+
 package Class::Tiny::Object;
 # ABSTRACT: Base class for classes built with Class::Tiny
 # VERSION
 
-use Carp ();
-
-if ( $] >= 5.010 ) {
-    require "mro.pm"; ## no critic: hack to hide from min version & prereq 
scanners
-}
-else {
-    require MRO::Compat;
-}
-
 sub new {
     my $class = shift;
 
@@ -118,7 +121,7 @@ sub DESTROY {
 
 1;
 
-=for Pod::Coverage new
+=for Pod::Coverage new get_all_attribute_for
 
 =head1 SYNOPSIS
 
@@ -288,6 +291,15 @@ values and errors are ignored.
         $self->cleanup();
     }
 
+=head2 Introspection
+
+You can retrieve an unsorted list of valid attributes known to Class::Tiny
+for a class and its superclasses with the C<get_all_attributes_for> class
+method.
+
+    my @attrs = Class::Tiny->get_all_attributes_for("Employee");
+    # @attrs contains qw/name ssn/
+
 =cut
 
 # vim: ts=4 sts=4 sw=4 et:
diff --git a/t/baker.t b/t/baker.t
index 784e17b..fa5cca4 100644
--- a/t/baker.t
+++ b/t/baker.t
@@ -8,6 +8,14 @@ use TestUtils;
 
 require_ok("Baker");
 
+subtest "attribute list" => sub {
+    is_deeply(
+        [ sort Class::Tiny->get_all_attributes_for("Baker") ],
+        [ sort qw/foo bar baz/ ],
+        "attribute list correct",
+    );
+};
+
 subtest "empty list constructor" => sub {
     my $obj = new_ok("Baker");
     is( $obj->foo, undef, "foo is undef" );
diff --git a/t/foxtrot.t b/t/foxtrot.t
index 286cf5b..f6eb4f9 100644
--- a/t/foxtrot.t
+++ b/t/foxtrot.t
@@ -8,6 +8,14 @@ use TestUtils;
 
 require_ok("Foxtrot");
 
+subtest "attribute list" => sub {
+    is_deeply(
+        [ sort Class::Tiny->get_all_attributes_for("Foxtrot") ],
+        [ sort qw/foo bar/ ],
+        "attribute list correct",
+    );
+};
+
 subtest "attribute set as list" => sub {
     my $obj = new_ok( "Foxtrot", [ foo => 42, bar => 23 ] );
     is( $obj->foo, 42, "foo is set" );

-- 
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