Added dist_author to Build.PL
[p5sagit/Class-Accessor-Grouped.git] / lib / Class / Accessor / Grouped.pm
index 0336faf..9ac75d1 100644 (file)
@@ -2,13 +2,15 @@ package Class::Accessor::Grouped;
 use strict;
 use warnings;
 use Carp;
+use Class::ISA;
+use Scalar::Util qw/blessed reftype/;
 use vars qw($VERSION);
 
-$VERSION = '0.01';
+$VERSION = '0.02';
 
 =head1 NAME
 
-Class:Accessor::Grouped-  Lets you build groups of accessors
+Class::Accessor::Grouped - Lets you build groups of accessors
 
 =head1 SYNOPSIS
 
@@ -269,11 +271,84 @@ sub set_simple {
   return $self->{$set} = $val;
 }
 
+
+=head2 get_inherited
+
+=over 4
+
+=item Arguments: $field
+
+Returns: $value
+
+=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.
+
+=cut
+
+sub get_inherited {
+    my ($self, $get) = @_;
+
+    if (blessed $self) {
+        if (reftype($self) eq 'HASH' && exists $self->{$get}) {
+            return $self->{$get};
+        } elsif (reftype($self) ne 'HASH') {
+            croak('Cannot get inherited value on an object instance that is not hash-based');
+        };
+    };
+
+    no strict 'refs';
+
+    my @supers = Class::ISA::self_and_super_path(ref $self || $self);
+    foreach (@supers) {
+        return ${$_.'::_'.$get} if defined(${$_.'::_'.$get});
+    };
+
+    return;
+}
+
+=head2 set_inherited
+
+=over 4
+
+=item Arguments: $field, $new_value
+
+Returns: $new_value
+
+=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.
+
+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') {
+            return $self->{$set} = $val;
+        } else {
+            croak('Cannot set inherited value on an object instance that is not hash-based');
+        };
+    } else {
+        no strict 'refs';
+
+        return ${$self.'::_'.$set} = $val;
+    };
+}
+
 1;
 
 =head1 AUTHORS
 
 Matt S. Trout <mst@shadowcatsystems.co.uk>
+Christopher H. Laco <claco@chrislaco.com>
 
 =head1 LICENSE