Inheritable.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:4k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. package Class::Data::Inheritable;
  2. use strict qw(vars subs);
  3. use vars qw($VERSION);
  4. $VERSION = '0.04';
  5. sub mk_classdata {
  6.     my ($declaredclass, $attribute, $data) = @_;
  7.     if( ref $declaredclass ) {
  8.         require Carp;
  9.         Carp::croak("mk_classdata() is a class method, not an object method");
  10.     }
  11.     my $accessor = sub {
  12.         my $wantclass = ref($_[0]) || $_[0];
  13.         return $wantclass->mk_classdata($attribute)->(@_)
  14.           if @_>1 && $wantclass ne $declaredclass;
  15.         $data = $_[1] if @_>1;
  16.         return $data;
  17.     };
  18.     my $alias = "_${attribute}_accessor";
  19.     *{$declaredclass.'::'.$attribute} = $accessor;
  20.     *{$declaredclass.'::'.$alias}     = $accessor;
  21. }
  22. __END__
  23. =head1 NAME
  24. Class::Data::Inheritable - Inheritable, overridable class data
  25. =head1 SYNOPSIS
  26.   package Stuff;
  27.   use base qw(Class::Data::Inheritable);
  28.   # Set up DataFile as inheritable class data.
  29.   Stuff->mk_classdata('DataFile');
  30.   # Declare the location of the data file for this class.
  31.   Stuff->DataFile('/etc/stuff/data');
  32.   # Or, all in one shot:
  33.   Stuff->mk_classdata(DataFile => '/etc/stuff/data');
  34. =head1 DESCRIPTION
  35. Class::Data::Inheritable is for creating accessor/mutators to class
  36. data.  That is, if you want to store something about your class as a
  37. whole (instead of about a single object).  This data is then inherited
  38. by your subclasses and can be overriden.
  39. For example:
  40.   Pere::Ubu->mk_classdata('Suitcase');
  41. will generate the method Suitcase() in the class Pere::Ubu.
  42. This new method can be used to get and set a piece of class data.
  43.   Pere::Ubu->Suitcase('Red');
  44.   $suitcase = Pere::Ubu->Suitcase;
  45. The interesting part happens when a class inherits from Pere::Ubu:
  46.   package Raygun;
  47.   use base qw(Pere::Ubu);
  48.   
  49.   # Raygun's suitcase is Red.
  50.   $suitcase = Raygun->Suitcase;
  51. Raygun inherits its Suitcase class data from Pere::Ubu.
  52. Inheritance of class data works analogous to method inheritance.  As
  53. long as Raygun does not "override" its inherited class data (by using
  54. Suitcase() to set a new value) it will continue to use whatever is set
  55. in Pere::Ubu and inherit further changes:
  56.   # Both Raygun's and Pere::Ubu's suitcases are now Blue
  57.   Pere::Ubu->Suitcase('Blue');
  58. However, should Raygun decide to set its own Suitcase() it has now
  59. "overridden" Pere::Ubu and is on its own, just like if it had
  60. overriden a method:
  61.   # Raygun has an orange suitcase, Pere::Ubu's is still Blue.
  62.   Raygun->Suitcase('Orange');
  63. Now that Raygun has overridden Pere::Ubu futher changes by Pere::Ubu
  64. no longer effect Raygun.
  65.   # Raygun still has an orange suitcase, but Pere::Ubu is using Samsonite.
  66.   Pere::Ubu->Suitcase('Samsonite');
  67. =head1 Methods
  68. =head2 mk_classdata
  69.   Class->mk_classdata($data_accessor_name);
  70.   Class->mk_classdata($data_accessor_name => $value);
  71. This is a class method used to declare new class data accessors.
  72. A new accessor will be created in the Class using the name from
  73. $data_accessor_name, and optionally initially setting it to the given
  74. value.
  75. To facilitate overriding, mk_classdata creates an alias to the
  76. accessor, _field_accessor().  So Suitcase() would have an alias
  77. _Suitcase_accessor() that does the exact same thing as Suitcase().
  78. This is useful if you want to alter the behavior of a single accessor
  79. yet still get the benefits of inheritable class data.  For example.
  80.   sub Suitcase {
  81.       my($self) = shift;
  82.       warn "Fashion tragedy" if @_ and $_[0] eq 'Plaid';
  83.       $self->_Suitcase_accessor(@_);
  84.   }
  85. =head1 AUTHOR
  86. Original code by Damian Conway.
  87. Maintained by Michael G Schwern until September 2005.
  88. Now maintained by Tony Bowden.
  89. =head1 BUGS and QUERIES
  90. Please direct all correspondence regarding this module to:
  91.   bug-Bit-Vector-Minimal@rt.cpan.org
  92. =head1 COPYRIGHT and LICENSE
  93. Copyright (c) 2000-2005, Damian Conway and Michael G Schwern. 
  94. All Rights Reserved.  
  95. This module is free software. It may be used, redistributed and/or
  96. modified under the terms of the Perl Artistic License (see
  97. http://www.perl.com/perl/misc/Artistic.html)
  98. =head1 SEE ALSO
  99. L<perltootc> has a very elaborate discussion of class data in Perl.
  100. =cut
  101. 1;