• Home
  • History
  • Annotate
  • only in this directory
NameDateSize

..11-Apr-2013244

Build.PLH A D29-Jan-2007281

ChangesH A D29-Jan-2007331

lib/H05-Apr-20133

Makefile.PLH A D29-Jan-20071.1 KiB

MANIFESTH A D29-Jan-2007154

MANIFEST.SKIPH A D29-Jan-2007409

META.ymlH A D29-Jan-2007298

READMEH A D29-Jan-20074.9 KiB

t/H11-Apr-20135

README

1NAME
2    Class::Data::Accessor - Inheritable, overridable class and instance data
3    accessor creation
4
5SYNOPSIS
6      package Stuff;
7      use base qw(Class::Data::Accessor);
8
9      # Set up DataFile as inheritable class data.
10      Stuff->mk_classaccessor('DataFile');
11
12      # Declare the location of the data file for this class.
13      Stuff->DataFile('/etc/stuff/data');
14
15      # Or, all in one shot:
16      Stuff->mk_classaccessor(DataFile => '/etc/stuff/data');
17
18      Stuff->DataFile; # returns /etc/stuff/data
19
20      my $stuff = Stuff->new; # your new, not ours
21
22      $stuff->DataFile; # returns /etc/stuff/data
23
24      $stuff->DataFile('/etc/morestuff'); # sets it on the object
25
26      Stuff->DataFile; # still returns /etc/stuff/data
27
28DESCRIPTION
29    Class::Data::Accessor is the marriage of Class::Accessor and
30    Class::Data::Inheritable into a single module. It is used for creating
31    accessors to class data that overridable in subclasses as well as in
32    class instances.
33
34    For example:
35
36      Pere::Ubu->mk_classaccessor('Suitcase');
37
38    will generate the method Suitcase() in the class Pere::Ubu.
39
40    This new method can be used to get and set a piece of class data.
41
42      Pere::Ubu->Suitcase('Red');
43      $suitcase = Pere::Ubu->Suitcase;
44
45    Taking this one step further, you can make a subclass that inherits from
46    Pere::Ubu:
47
48      package Raygun;
49      use base qw(Pere::Ubu);
50
51      # Raygun's suitcase is Red.
52      $suitcase = Raygun->Suitcase;
53
54    Raygun inherits its Suitcase class data from Pere::Ubu.
55
56    Inheritance of class data works analogous to method inheritance. As long
57    as Raygun does not "override" its inherited class data (by using
58    Suitcase() to set a new value) it will continue to use whatever is set
59    in Pere::Ubu and inherit further changes:
60
61      # Both Raygun's and Pere::Ubu's suitcases are now Blue
62      Pere::Ubu->Suitcase('Blue');
63
64    However, should Raygun decide to set its own Suitcase() it has now
65    "overridden" Pere::Ubu and is on its own, just like if it had overridden
66    a method:
67
68      # Raygun has an orange suitcase, Pere::Ubu's is still Blue.
69      Raygun->Suitcase('Orange');
70
71    Now that Raygun has overridden Pere::Ubu, further changes by Pere::Ubu
72    no longer effect Raygun.
73
74      # Raygun still has an orange suitcase, but Pere::Ubu is using Samsonite.
75      Pere::Ubu->Suitcase('Samsonite');
76
77    You can also override this class data on a per-object basis. If $obj isa
78    Pere::Ubu then
79
80      $obj->Suitcase; # will return Samsonite
81
82      $obj->Suitcase('Purple'); # will set Suitcase *for this object only*
83
84    And after you've done that,
85
86      $obj->Suitcase; # will return Purple
87
88    but
89
90      Pere::Ubu->Suitcase; # will still return Samsonite
91
92    If you don't want this behaviour use Class::Data::Inheritable instead.
93
94    "mk_classaccessor" will die if used as an object method instead of as a
95    class method.
96
97METHODS
98  mk_classaccessor
99      Class->mk_classaccessor($data_accessor_name);
100      Class->mk_classaccessor($data_accessor_name => $value);
101
102    This is a class method used to declare new class data accessors. A new
103    accessor will be created in the Class using the name from
104    $data_accessor_name, and optionally initially setting it to the given
105    value.
106
107    To facilitate overriding, mk_classaccessor creates an alias to the
108    accessor, _field_accessor(). So Suitcase() would have an alias
109    _Suitcase_accessor() that does the exact same thing as Suitcase(). This
110    is useful if you want to alter the behavior of a single accessor yet
111    still get the benefits of inheritable class data. For example.
112
113      sub Suitcase {
114          my($self) = shift;
115          warn "Fashion tragedy" if @_ and $_[0] eq 'Plaid';
116
117          $self->_Suitcase_accessor(@_);
118      }
119
120    Overriding accessors does not work in the same class as you declare the
121    accessor in. It only works in subclasses due to the fact that
122    subroutines are loaded at compile time and accessors are loaded at
123    runtime, thus overriding any subroutines with the same name in the same
124    class.
125
126  mk_classaccessors(@accessornames)
127    Takes a list of names and generates an accessor for each name in the
128    list using "mk_classaccessor".
129
130AUTHORS
131    Based on the creative stylings of Damian Conway, Michael G Schwern, Tony
132    Bowden (Class::Data::Inheritable) and Michael G Schwern, Marty Pauley
133    (Class::Accessor).
134
135    Coded by Matt S Trout Tweaks by Christopher H. Laco.
136
137BUGS and QUERIES
138    If your object isn't hash-based, this will currently break. My
139    modifications aren't exactly sophisticated so far.
140
141    mstrout@cpan.org or bug me on irc.perl.org, nick mst claco@cpan.org or
142    irc.perl.org, nick claco
143
144LICENSE
145    This module is free software. It may be used, redistributed and/or
146    modified under the terms of the Perl Artistic License (see
147    http://www.perl.com/perl/misc/Artistic.html)
148
149SEE ALSO
150    perltootc has a very elaborate discussion of class data in Perl.
151    Class::Accessor, Class::Data::Inheritable
152
153