summaryrefslogtreecommitdiff
path: root/lib/Class/MakeMethods/Template/PackageVar.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Class/MakeMethods/Template/PackageVar.pm')
-rw-r--r--lib/Class/MakeMethods/Template/PackageVar.pm168
1 files changed, 168 insertions, 0 deletions
diff --git a/lib/Class/MakeMethods/Template/PackageVar.pm b/lib/Class/MakeMethods/Template/PackageVar.pm
new file mode 100644
index 0000000..da0f7be
--- /dev/null
+++ b/lib/Class/MakeMethods/Template/PackageVar.pm
@@ -0,0 +1,168 @@
+package Class::MakeMethods::Template::PackageVar;
+
+use Class::MakeMethods::Template::Generic '-isasubclass';
+
+$VERSION = 1.008;
+use strict;
+require 5.0;
+use Carp;
+
+=head1 NAME
+
+Class::MakeMethods::Template::PackageVar - Static methods with global variables
+
+=head1 SYNOPSIS
+
+ package MyObject;
+ use Class::MakeMethods::Template::PackageVar (
+ scalar => [ 'foo' ]
+ );
+
+ package main;
+
+ MyObject->foo('bar')
+ print MyObject->foo();
+
+ $MyObject::foo = 'bazillion';
+ print MyObject->foo();
+
+=head1 DESCRIPTION
+
+These meta-methods provide access to package (class global) variables.
+These are essentially the same as the Static meta-methods, except
+that they use a global variable in the declaring package to store
+their values.
+
+B<Common Parameters>: The following parameters are defined for PackageVar meta-methods.
+
+=over 4
+
+=item variable
+
+The name of the variable to store the value in. Defaults to the same name as the method.
+
+=back
+
+=cut
+
+sub generic {
+ {
+ '-import' => {
+ 'Template::Generic:generic' => '*'
+ },
+ 'params' => {
+ 'variable' => '*'
+ },
+ 'modifier' => {
+ '-all' => [ q{ no strict; * } ],
+ },
+ 'code_expr' => {
+ '_VALUE_' => '${_ATTR_{target_class}."::"._ATTR_{variable}}',
+ },
+ }
+}
+
+########################################################################
+
+=head2 Standard Methods
+
+The following methods from Generic should all be supported:
+
+ scalar
+ string
+ string_index (?)
+ number
+ boolean
+ bits (?)
+ array (*)
+ hash (*)
+ tiedhash (?)
+ hash_of_arrays (?)
+ object (?)
+ instance (?)
+ array_of_objects (?)
+ code (?)
+ code_or_scalar (?)
+
+See L<Class::MakeMethods::Template::Generic> for the interfaces and behaviors of these method types.
+
+The items marked with a * above are specifically defined in this package, whereas the others are formed automatically by the interaction of this package's generic settings with the code templates provided by the Generic superclass.
+
+The items marked with a ? above have not been tested sufficiently; please inform the author if they do not function as you would expect.
+
+=cut
+
+########################################################################
+
+sub array {
+ {
+ '-import' => {
+ 'Template::Generic:array' => '*',
+ },
+ 'modifier' => {
+ '-all' => q{ no strict; _ENSURE_REF_VALUE_; * },
+ },
+ 'code_expr' => {
+ '_ENSURE_REF_VALUE_' => q{
+ _REF_VALUE_ or @{_ATTR_{target_class}."::"._ATTR_{variable}} = ();
+ },
+ '_VALUE_' => '\@{_ATTR_{target_class}."::"._ATTR_{variable}}',
+ },
+ }
+}
+
+########################################################################
+
+sub hash {
+ {
+ '-import' => {
+ 'Template::Generic:hash' => '*',
+ },
+ 'modifier' => {
+ '-all' => q{ no strict; _ENSURE_REF_VALUE_; * },
+ },
+ 'code_expr' => {
+ '_ENSURE_REF_VALUE_' => q{
+ _REF_VALUE_ or %{_ATTR_{target_class}."::"._ATTR_{variable}} = ();
+ },
+ '_VALUE_' => '\%{_ATTR_{target_class}."::"._ATTR_{variable}}',
+ },
+ }
+}
+
+########################################################################
+
+=head2 PackageVar:vars
+
+This rewrite rule converts package variable names into PackageVar methods of the equivalent data type.
+
+Here's an example declaration:
+
+ package MyClass;
+
+ use Class::MakeMethods::Template::PackageVar (
+ vars => '$DEBUG %Index'
+ );
+
+MyClass now has methods that get and set the contents of its $MyClass::DEBUG and %MyClass::Index package variables:
+
+ MyClass->DEBUG( 1 );
+ MyClass->Index( 'foo' => 'bar' );
+
+=cut
+
+sub vars {
+ my $mm_class = shift;
+ my @rewrite = map [ "Template::PackageVar:$_" ], qw( scalar array hash );
+ my %rewrite = ( '$' => 0, '@' => 1, '%' => 2 );
+ while (@_) {
+ my $name = shift;
+ my $data = shift;
+ $data =~ s/\A(.)//;
+ push @{ $rewrite[ $rewrite{ $1 } ] }, { 'name'=>$name, 'variable'=>$data };
+ }
+ return @rewrite;
+}
+
+
+1;