[Bast-commits] r3271 - in trunk/Class-Accessor-Grouped: . lib/Class/Accessor t t/lib

claco at dev.catalyst.perl.org claco at dev.catalyst.perl.org
Wed May 9 02:55:35 GMT 2007


Author: claco
Date: 2007-05-09 02:55:34 +0100 (Wed, 09 May 2007)
New Revision: 3271

Added:
   trunk/Class-Accessor-Grouped/t/component.t
Modified:
   trunk/Class-Accessor-Grouped/Changes
   trunk/Class-Accessor-Grouped/Makefile.PL
   trunk/Class-Accessor-Grouped/README
   trunk/Class-Accessor-Grouped/lib/Class/Accessor/Grouped.pm
   trunk/Class-Accessor-Grouped/t/lib/AccessorGroups.pm
Log:
Added get/set_component_class


Modified: trunk/Class-Accessor-Grouped/Changes
===================================================================
--- trunk/Class-Accessor-Grouped/Changes	2007-05-08 23:54:20 UTC (rev 3270)
+++ trunk/Class-Accessor-Grouped/Changes	2007-05-09 01:55:34 UTC (rev 3271)
@@ -1,5 +1,8 @@
 Revision history for Class::Accessor::Grouped.
 
+0.05000 Tue May 08 19:42:33 2007
+    - Added get/set_component_class
+
 0 04000 Sat May 05 21:17:23 2007
     - Converted to Module::Install
     - Added culterific tests/TEST_AUTHOR

Modified: trunk/Class-Accessor-Grouped/Makefile.PL
===================================================================
--- trunk/Class-Accessor-Grouped/Makefile.PL	2007-05-08 23:54:20 UTC (rev 3270)
+++ trunk/Class-Accessor-Grouped/Makefile.PL	2007-05-09 01:55:34 UTC (rev 3271)
@@ -11,6 +11,7 @@
 requires 'Carp';
 requires 'Scalar::Util';
 requires 'Class::ISA';
+requires 'Class::Inspector';
 
 tests "t/*.t t/*/*.t";
 clean_files "Class-Accessor-Grouped-* t/var";

Modified: trunk/Class-Accessor-Grouped/README
===================================================================
--- trunk/Class-Accessor-Grouped/README	2007-05-08 23:54:20 UTC (rev 3270)
+++ trunk/Class-Accessor-Grouped/README	2007-05-09 01:55:34 UTC (rev 3271)
@@ -94,6 +94,32 @@
     Note:: This method will die if you try to set an object variable on a
     non hash-based object.
 
+  get_component_class
+    Arguments: $field
+        Returns: $value
+
+    Gets the value of the specified component class.
+
+        __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
+    
+        $self->result_class->method();
+    
+        ## same as
+        $self->get_component_class('result_class')->method();
+
+  set_component_class
+    Arguments: $field, $class
+        Returns: $new_value
+
+    Inherited accessor that automatically loads the specified class before
+    setting it. This method will die if the specified class could not be
+    loaded.
+
+        __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
+        __PACKAGE__->result_class('MyClass');
+    
+        $self->result_class->method();
+
   get_super_paths
     Returns a list of 'parent' or 'super' class names that the current class
     inherited from.

Modified: trunk/Class-Accessor-Grouped/lib/Class/Accessor/Grouped.pm
===================================================================
--- trunk/Class-Accessor-Grouped/lib/Class/Accessor/Grouped.pm	2007-05-08 23:54:20 UTC (rev 3270)
+++ trunk/Class-Accessor-Grouped/lib/Class/Accessor/Grouped.pm	2007-05-09 01:55:34 UTC (rev 3271)
@@ -2,11 +2,13 @@
 use strict;
 use warnings;
 use Carp;
-use Class::ISA;
-use Scalar::Util qw/blessed reftype/;
+use Class::Inspector ();
+use Class::ISA ();
+use Scalar::Util ();
+
 use vars qw($VERSION);
 
-$VERSION = '0.04000';
+$VERSION = '0.05000';
 
 =head1 NAME
 
@@ -56,7 +58,7 @@
 
     sub _mk_group_accessors {
         my($self, $maker, $group, @fields) = @_;
-        my $class = ref $self || $self;
+        my $class = Scalar::Util::blessed($self) || $self;
 
         # So we don't have to do lots of lookups inside the loop.
         $maker = $self->can($maker) unless ref $maker;
@@ -74,8 +76,6 @@
             my $accessor = $self->$maker($group, $field);
             my $alias = "_${name}_accessor";
 
-            #warn "$class $group $field $alias";
-
             *{$class."\:\:$name"}  = $accessor;
               #unless defined &{$class."\:\:$field"}
 
@@ -282,9 +282,11 @@
 
 =back
 
-Simple getter for Classes and hash-based objects which returns the value for the field name passed as
-an argument. This behaves much like L<Class::Data::Accessor> where the field can be set in a
-base class, inherited and changed in subclasses, and inherited and changed for object instances.
+Simple getter for Classes and hash-based objects which returns the value for
+the field name passed as an argument. This behaves much like
+L<Class::Data::Accessor> where the field can be set in a base class,
+inherited and changed in subclasses, and inherited and changed for object
+instances.
 
 =cut
 
@@ -292,8 +294,8 @@
     my ($self, $get) = @_;
     my $class;
 
-    if (blessed $self) {
-        my $reftype = reftype $self;
+    if (Scalar::Util::blessed($self)) {
+        my $reftype = Scalar::Util::reftype($self);
         $class = ref $self;
 
         if ($reftype eq 'HASH' && exists $self->{$get}) {
@@ -329,19 +331,21 @@
 
 =back
 
-Simple setter for Classes and hash-based objects which sets and then returns the value
-for the field name passed as an argument. When called on a hash-based object it will set the appropriate
-hash key value. When called on a class, it will set a class level variable.
+Simple setter for Classes and hash-based objects which sets and then returns
+the value for the field name passed as an argument. When called on a hash-based
+object it will set the appropriate hash key value. When called on a class, it
+will set a class level variable.
 
-B<Note:>: This method will die if you try to set an object variable on a non hash-based object.
+B<Note:>: This method will die if you try to set an object variable on a non
+hash-based object.
 
 =cut
 
 sub set_inherited {
     my ($self, $set, $val) = @_;
 
-    if (blessed $self) {
-        if (reftype($self) eq 'HASH') {
+    if (Scalar::Util::blessed($self)) {
+        if (Scalar::Util::reftype($self) eq 'HASH') {
             return $self->{$set} = $val;
         } else {
             croak('Cannot set inherited value on an object instance that is not hash-based');
@@ -353,6 +357,67 @@
     };
 }
 
+=head2 get_component_class
+
+=over 4
+
+=item Arguments: $field
+
+Returns: $value
+
+=back
+
+Gets the value of the specified component class.
+
+    __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
+    
+    $self->result_class->method();
+    
+    ## same as
+    $self->get_component_class('result_class')->method();
+
+=cut
+
+sub get_component_class {
+    my ($self, $field) = @_;
+
+    return $self->get_inherited($field);
+};
+
+=head2 set_component_class
+
+=over 4
+
+=item Arguments: $field, $class
+
+Returns: $new_value
+
+=back
+
+Inherited accessor that automatically loads the specified class before setting
+it. This method will die if the specified class could not be loaded.
+
+    __PACKAGE__->mk_group_accessors('component_class' => 'result_class');
+    __PACKAGE__->result_class('MyClass');
+    
+    $self->result_class->method();
+
+=cut
+
+sub set_component_class {
+    my ($self, $field, $value) = @_;
+
+    if ($value) {
+        if (!Class::Inspector->loaded($value)) {
+            eval "use $value";
+
+            croak("Could not load $field '$value': ", $@) if $@;
+        };
+    };
+
+    return $self->set_inherited($field, $value);
+};
+
 =head2 get_super_paths
 
 Returns a list of 'parent' or 'super' class names that the current class inherited from.
@@ -360,7 +425,7 @@
 =cut
 
 sub get_super_paths {
-    my $class = blessed $_[0] || $_[0];
+    my $class = Scalar::Util::blessed $_[0] || $_[0];
 
     return Class::ISA::super_path($class);
 };

Added: trunk/Class-Accessor-Grouped/t/component.t
===================================================================
--- trunk/Class-Accessor-Grouped/t/component.t	                        (rev 0)
+++ trunk/Class-Accessor-Grouped/t/component.t	2007-05-09 01:55:34 UTC (rev 3271)
@@ -0,0 +1,25 @@
+use Test::More tests => 7;
+use strict;
+use warnings;
+use lib 't/lib';
+use Class::Inspector;
+use AccessorGroups;
+
+is(AccessorGroups->result_class, undef);
+
+# croak on set where class can't be loaded
+my $dying = AccessorGroups->new;
+eval {
+    $dying->result_class('Junkies');
+};
+ok($@ =~ /Could not load result_class 'Junkies'/);
+is($dying->result_class, undef);
+
+ok(!Class::Inspector->loaded('BaseInheritedGroups'));
+AccessorGroups->result_class('BaseInheritedGroups');
+ok(Class::Inspector->loaded('BaseInheritedGroups'));
+is(AccessorGroups->result_class, 'BaseInheritedGroups');
+
+## unset it
+AccessorGroups->result_class(undef);
+is(AccessorGroups->result_class, undef);
\ No newline at end of file


Property changes on: trunk/Class-Accessor-Grouped/t/component.t
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: trunk/Class-Accessor-Grouped/t/lib/AccessorGroups.pm
===================================================================
--- trunk/Class-Accessor-Grouped/t/lib/AccessorGroups.pm	2007-05-08 23:54:20 UTC (rev 3270)
+++ trunk/Class-Accessor-Grouped/t/lib/AccessorGroups.pm	2007-05-09 01:55:34 UTC (rev 3271)
@@ -6,6 +6,7 @@
 __PACKAGE__->mk_group_accessors('single', 'singlefield');
 __PACKAGE__->mk_group_accessors('multiple', qw/multiple1 multiple2/);
 __PACKAGE__->mk_group_accessors('listref', [qw/lr1name lr1field/], [qw/lr2name lr2field/]);
+__PACKAGE__->mk_group_accessors('component_class', 'result_class');
 
 sub new {
     return bless {}, shift;




More information about the Bast-commits mailing list